https://codeforces.com/problemset/problem/1118/D2
也是很好想的一个二分啦。
验证m的可行性的时候,肯定是把最多咖啡因的咖啡先尽可能平均分到每一天,因为同一天内调换喝咖啡的顺序只会非增,而且平均分更优是显然的。
#include<bits/stdc++.h> using namespace std; #define ll long long int n,m; int a[200005]; int ok(int mi){ ll sum=0; for(int i=0;i<n;i++){ sum+=max(0,a[i]-i/mi); } if(sum>=m) return 1; else return 0; } int binary(){ int l=1,r=1e9,m; while(1){ m=(l+r)>>1; if(l==m){ if(ok(l)){ return l; } else if(ok(r)){ return r; } else{ return -1; } } if(ok(m)){ r=m; } else{ l=m+1; } } } int main(){ scanf("%d%d",&n,&m); for(int i=0;i<n;i++){ scanf("%d",&a[i]); } sort(a,a+n,greater<int>()); printf("%d ",binary()); }