4 条题解

  • 1
    @ 2024-4-10 11:04:26
    #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;
    }
    

    信息

    ID
    89
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    935
    已通过
    208
    上传者