返回题解分享
讨论 / 题解分享/ 帖子详情

砍树 - 题解

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
int n;
const int N=1e6+5;
ll m,a[N];

bool check(ll mid){
    ll sum=0;
    for(int i=1;i<=n;i++){
        if(a[i]-mid<=0){//如果该树高<=砍树高度,直接跳过
            continue;
        }
        sum+=(a[i]-mid);
    }
    if(sum>=m){//当sum>=m说明砍树的高度要<=该mid
        return true;
    }
    return false;
}

int main(){
    cin>>n>>m;
    ll maxx=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        maxx=max(maxx,a[i]);
    }
    sort(a+1,a+1+n);//先排序
    ll l=1,r=maxx,ans=0;
    while (r - l > 1) // 当右边界与左边界相差大于1时
	{
		int mid = (l + r) >> 1; // 取中间位置
		if (check(mid)){ // 如果满足条件
            ans=mid;//最后得到的mid就是答案
			l = mid; // 更新左边界为mid
        }
		else{
			r = mid; // 否则更新右边界为mid
	    }
    }
    cout<<ans<<endl;
    return 0;
}
0 回复 0 转发 1 喜欢 1 阅读
回复 (0)
默认 最新
暂无回复,快来抢沙发!