【洛谷题解/COCI 2011/2012 #5】P1873 EKO / 砍树

题目概况

题目链接: https://www.luogu.com.cn/problem/P1873
难度: 普及/提高-,高了(确信

题目分析

简化题目: 简洁至极
涉及知识点: 二分答案
解题思路:
一个裸的二分答案板子题

代码拆解及要点分析

有一点需要提醒:
我们在统计当前高度可以得到多长的木材时,需要判断当前这棵树的高度是否大于mid,要不然会有负数。

完整代码

#include 
#include 
#define ll long long
using namespace std;

const int MAXN = 1e6 + 5;
ll n, m, ans, maxn;
ll a[MAXN];

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) {
		scanf("%d", &a[i]);
		maxn = max(maxn, a[i]);
	}
	int l = 1, r = maxn;
	while (l <= r) {
		int mid = (l + r) / 2;
		ll sum = 0;
		for (int i = 1; i <= n; i++) {
			if (a[i] >= mid) { //判断能不能砍到
				sum += a[i] - mid;
			} 
		}
		if (sum < m) { //如果得不到那么多,就说明举高了
			r = mid - 1;
		} else { //得到大于等于m的木材,我们可以尝试再举高一点
			l = mid + 1;
			ans = mid;
		}
	}
	cout << ans << endl;
	return 0;
}

你可能感兴趣的:(洛谷题解,国外竞赛题解,算法,二分法)