#include <iostream>
#include <vector>
using namespace std;
long long N, M;
vector<long long> v;
int main(int argc, char **argv){
scanf("%lld %lld",&N,&M);
long long x, maxN = 0;
for(int i=0; i<N; i++){
scanf("%lld",&x);
v.push_back(x);
if(maxN < x){
maxN = x;
}
}
long long left = 1, right = maxN, mid; // 이진탐색
long long result = 0;
while(left <= right){
mid = (left + right) / 2;
long long tmp = 0;
for(int i=0; i<v.size(); i++){
if(v[i] >= mid){
tmp += v[i] - mid;
}
}
if(tmp >= M){
left = mid + 1;
result = mid;
} else {
right = mid - 1;
}
}
printf("%lld", result);
return 0;
}
이진 탐색이라고 생각해낼 수 있어서 뿌듯했다. 코드는 아직 익숙치못해서 블로그에 예전에 푼 이진 탐색 코드를 확인하고 풀었다. 조금 더 풀어보면 바로 생각나는 날이 오겠지...
그리고 범위 확인하고 int 말고 long long을 써야하는지 확인하자.