직전에 해결한 랜선 자르기와 풀이 과정 자체가 유사해서 그대로 코드를 가져다 썻다. 다만 다른 점이 있다면 나무의 높이의 합을 구해서 구분을 해줘야 한다는 점이랑 숫자의 범위가 훨씬 더 커져서 long long int로 처리를 해줘야 한다는 점이다. 그래서 한 번 틀리긴 했지만 결과적으로는 어렵지 않게 해결할 수 있었다. 실버2 문제 치고는 매우 쉽다는 생각이 들었다.
# include <iostream>
# include <algorithm>
using namespace std;
long long int N, M, max_temp = 0, l = 1, r = 0, m, ans = 0;
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N >> M;
long long int* arr = new long long int[N];
for (long long int i = 0; i < N; i ++){
cin >> arr[i];
max_temp = max(max_temp, arr[i]);
}
r = max_temp;
while (l <= r){
long long int temp = 0;
m = (l + r) / 2;
for (long long int i = 0; i < N; i++){
if (arr[i] > m) temp += arr[i] - m;
}
if (temp >= M){
l = m + 1;
ans = max(ans, m);
}
else r = m - 1;
}
cout << ans << "\n";
}