https://www.acmicpc.net/problem/2805
#include <iostream>
#include <vector>
using namespace std;
// 잘라낸 값을 모두 합쳤을 때 N과 같거나 큰지 여부
bool can_cut(const vector<int> &woods, int len, int target)
{
int remainder = 0;
for (int i = 0; i < woods.size(); i++)
{
if (woods[i] >= len)
{
remainder += woods[i] - len;
}
}
return remainder >= target;
}
int main(void)
{
freopen("wood.txt", "r", stdin);
int N;
cin >> N;
int need;
cin >> need;
vector<int> woods(N);
for (int i = 0; i < N; i++)
{
cin >> woods[i];
}
int left = 1; // 자른 값은 1 이상이어야 하기 때문에 최소 값 1로 설정
int right = *max_element(woods.begin(), woods.end()); // 가장 큰 나무 이상 값으로 자를 수 없기 때문에 가장 큰 나무가 최대 값으로 설정
int answer = 0;
while (left <= right)
{
int mid = (left + right) / 2;
if (can_cut(woods, mid, need))
{
answer = mid;
left = mid + 1;
}
else
{
right = mid - 1;
}
}
cout << answer << endl;
return 0;
}