题目链接:https://www.luogu.com.cn/problem/P1873
首先,在已知砍伐高度 h 的情况下,我们可以直接求得能够得到的木材总长度。
所以,我们可以开一个函数 bool check(int h)
,用于判断在砍伐高度为 h 的情况下,得到的木材总长度是否 ≥ M;如果是,则返回 true ,否则,返回 false。
可以发现,随着砍伐高度的上升,得到的木材的数量肯定是减小的。所以存在一个高度 H,使得当 h ≤ H 时,check(h)
返回 true;当 h ≥ H+1 时,check(h)
返回 false。
我们可以通过以 h 为自变量,以 check(h)
的结果为应变量进行二分,得到这个答案。
实现代码如下:
#include <bits/stdc++.h>
using namespace std;
int n;
long long m, h[1000010];
bool check(int H) {
long long sum = 0;
for (int i = 0; i < n; i ++) {
sum += max(0LL, h[i]-H);
}
return sum >= m;
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i ++) cin >> h[i];
int L = 0, R = 1e9, res;
while (L <= R) {
int mid = (L + R) / 2;
if (check(mid)) {
res = mid;
L = mid+1;
}
else R = mid-1;
}
cout << res << endl;
return 0;
}