明显的二分;看数据范围,求满足条件的最小值,二分操作;
#include<bits/stdc++.h> using namespace std; #define int long long int a[1000010],m,n; bool check(int mid) { int ans=0,j=0; for(int i=n;i>=1;i--) { if(j<mid) ans+=a[i],j++; else { ans=max(ans,a[i]-j/mid+ans); j++; } } if(ans>=m) return true; return false; } signed main() { cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+1+n); int l=1,r=1000000010,k=-1; while(l<=r) { int mid=(l+r)>>1; if(check(mid)) k=mid,r=mid-1; else l=mid+1; } cout<<k<<endl; }