思路

我们可以看出,答案是具有单调性的,所以我们可以考虑二分答案。
我们排序后,按每一天进行安排,如果就退出循环。
Code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1e6 + 5;
ll n,m,a[N];
bool check(int x)
{
    ll sum = 0;
    int t = 0;
    for(int i=1;i<=n;i++)
    {
        sum += (a[i] - t);
        if(i % x == 0)
        {
            t++;
        }
        if(a[i] - t <= 0)break;
    }
    if(sum >= m)return true;
    else return false;
}
int main()
{
    scanf("%lld %lld",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
    }
    sort(a + 1,a + 1 + n,greater<ll>());
    ll l = 1,r = n + 1,ans = 999999999;
    while(l < r)
    {
        ll mid = (l + r) / 2;
        if(check(mid))r = mid,ans = min(ans,r);
        else l = mid + 1;
    }
    printf("%lld",ans == 999999999 ? -1 : ans);
    return 0;
}