4 条题解
-
1
#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
- 上传者