예전에 class3 에센셜 문제를 다 풀었었는데, 새롭게 한 문제가 생겼길래 풀어봤다.
제일 까다로웠던 부분이 나무의 길이가 '넘침'>'적음'>'넘침'으로 갈 때 종료 조건을 어떻게 할까였는데, 생각하다가 max-min>1일때(예를 들어 13~15면 middle이 14로 고정이므로)로 설정했다.
이진탐색() * 나무의 개수()
=
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
int n;
long long m;
int arr[1000000];
cin>>n>>m;
for(int i=0; i<n; i++){
cin>>arr[i];
}
int min=0,max=*max_element(arr, arr + n);// 최대 나무 길이 찾기
while (max-min>1) // 중간 값이 고정 됨
{
int middle = (min+max)/2;
long long cnt=0;
for(int i=0; i<=n-1; i++){ // 나무 길이 합하기
if(arr[i]-middle>0) cnt+= arr[i]-middle;
}
if(cnt == m) break;
else if (cnt > m){ // m보다 합이 크면 >> 더 조금 잘라야 함
min = middle;
}
else { //m 보다 합이 작으면 >> 더 많이 잘라야 함
max = middle;
}
}
cout<<(min+max)/2;
return 0;
}