思路
我们可以看出,答案是具有单调性的,所以我们可以考虑二分答案。
我们排序后,按每一天进行安排,如果就退出循环。
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;
} 
京公网安备 11010502036488号