check()是验证当前值是否可行,我们不妨二分高度
判断某个高度砍的木柴总长度是否是M
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1E6 + 5;
typedef long long ll;
ll h[N]; //可能超出,需要ll
int n, m;
bool check(int x)
{
ll res = 0;
for (int i = 0;i < n;i++)
if (h[i] > x)
res += h[i] - x;
return res >= m;
}
int main()
{
cin >> n >> m;
for (int i = 0;i < n;i++)
cin >> h[i];
ll l = 0, r = 2*1e9;
while (l < r)
{
int mid = l + r+1 >> 1;
if (check(mid))
l = mid;
else
r = mid - 1;
}
cout << l;
}