【洛谷】P1873 [COCI 2011/2012 #5] EKO / 砍树 (二分)

发布时间 2023-12-20 09:18:59作者: 綾川雪絵

题目描述见: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;
}

一些其他有趣的答案

题解 P1873 【砍树】 - Sweetlemon 的博客 - 洛谷博客 (luogu.com.cn)