砍伐树木

虚空终端  •  1年前


看来是我小看这道题了,最开始我用的暴力枚举,无论是正序还是倒序都超时 所以这题要用二分查找法,不然就会极其惨烈 不说别的了,上代码:

#include<iostream>
using namespace std;
const int N=1e6+5;
int n,m,ans,l=1,r;
int a[N];
bool check(int k){
	long long d=0;
    for (int i=1;i<=n;i++)
		if (a[i]>k) d+=a[i]-k;
    if (d>=m) return true;
	return false;
}
int main(){
    cin>>n>>m;
    for (int i=1;i<=n;i++){
        cin>>a[i];
        if (a[i]>r) r=a[i];
    }
    while (l<=r){
        int mid=(l+r)/2;
        if (check(mid))
		{
			ans=mid;
			l=mid+1;
		}
        else r=mid-1;
    }
    cout<<ans;
	return 0; 
}


评论:

xubi


root  •  1年前

请先登录,才能进行评论