明显的二分;看数据范围,求满足条件的最小值,二分操作;

#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;
}