P1873题解
这是一道基础的二分题
首先我们发现砍树的高度越低获得的木材越多
所以我们每次二分都用check函数判断这个高度是否能获得足够的木材如果可以就记录下来并且把范围向右扩大否则向左缩小
代码如下
#include<bits/stdc++.h>
using namespace std;
const int M=1e9;
long long n,m,a[1000005];
bool check(long long x){long long sum=0;for(int i=1;i<=n;i++){if(a[i]-x>0)sum+=a[i]-x;}if(sum>=m)return 1;else return 0;
}
int main(){scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++)scanf("%lld",&a[i]);sort(a+1,a+n+1);int l=1,r=a[n];while(l<=r){int mid=l+(r-l)/2;if(!check(mid)){r=mid-1;}else{l=mid+1;}}cout<<l-1;return 0;
}