洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树 题解

洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树 题解

题目传送门

思路

我们可以使用二分答案法。

二分查找砍树的高度\(H\),每次使用\(check(long\ long\ x)\)函数用于检测在\(x\)米高度时是否可以砍到\(m\)米以上的木头。

\(check\)函数是用一个循环从1到\(n\),每次计数器\(sum\)加上0和\(h_i-x\)的最大值(因为不可能砍到负数米木头)。最后返回\(sum\le m\)

在二分循环内,如果\(check\)函数返回true,则代表木头太多了,需要提高高度,所以要把\(l\)赋值为\(mid\),反之,返回false时,代表木头太少了,需要降低高度,所以要把\(r\)赋值为\(mid\)

代码

#include<bits/stdc++.h>
#define endl '\n'

using namespace std;

int n;
long long m,t[1000005];
bool check(long long h){
	long long sum=0;
	for(int i=1;i<=n;i++){
		sum+=max(0ll,t[i]-h);
	}
	return sum>=m;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>t[i];
	int l=0,r=400001;
	while(l+1<r){
		int mid=(l+r)/2;
		if(check(mid)) l=mid;
		else r=mid;
	}
	cout<<l<<endl;
	return 0;
}
posted @ 2025-02-08 10:48  2789617221guo  阅读(165)  评论(0)    收藏  举报