明显的二分;看数据范围,求满足条件的最小值,二分操作;
#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;
}
京公网安备 11010502036488号