泥豪!我是2789617221guo!欢|

2789617221guo

园龄:1个月粉丝:2关注:2

2025-02-08 10:48阅读: 20评论: 0推荐: 0

洛谷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;
}

本文作者:2789617221guo

本文链接:https://www.cnblogs.com/2789617221guo/p/18703797

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   2789617221guo  阅读(20)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起