题目描述见:P1873
思路比较明确qwq因为答案显然满足单调性:当x超过某个数一定是错的(收集的木材大于m),而小于x一定是对的,并且x是从0一直递增。故我们只需二分法找到x。
直接看代码吧qwq精髓是check函数直接模拟题目要求ww
#include <iostream>
using namespace std;
#define MAXN 1000010
typedef long long LL; //之后少打字ww
LL a[MAXN], n, m;
bool check(int h) { //砍树高度为H时是否能得到大于m的木材
LL tol = 0;
for (int i = 1; i <= n; i++)
if (a[i] > h)
tol += a[i] - h;
return tol >= m; //直接模拟
}
int main() {
scanf("%lld%lld", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
int l = 0, r = 1e9, ans, mid;
while (l <= r) {
if (check(mid = l + r >> 1))
ans = mid, l = mid + 1; //满足条件,继续往右边搜索,直到最后的临界点mid
else
r = mid - 1;
}
//ans = l-1,有些题解这么写是因为即使mid满足,l也会+1,最后输出答案右侧
printf("%d", ans);
return 0;
}
一些其他有趣的答案
标签:EKO,洛谷,int,mid,砍树,tol,ans,P1873 From: https://www.cnblogs.com/Yukie/p/17915388.html