有 n 杯咖啡, m 本作业, 每杯咖啡有一定能量,有 x 个能量就能完成 x 本作业,但是如果连续喝咖啡,会衰减能量,第一杯 为 a[i] , 第二杯 为 a[i]-1 第三杯 为 a[i] - 2....以此类推
问最少花费几天 解决m个作业
简单版本可以暴力遍历,复杂版本就得靠二分法了
二分枚举完成天数,然后模拟。。。
#include<bits/stdc++.h>
using namespace std;
#define ll long long int
const int maxn=2e5+5;
int n,m;
int a[maxn];
inline bool cmp(int a,int b){return a>b;}
inline bool check(int mid)
{
ll res = 0;
int te = mid, cnt = 0;
for(int i=1;i<=n;i++)
{
if(te == 0)
{
te = mid;
cnt++;
}
res += max(0, a[i]-cnt);
te --;
}
return res>=m;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
sort(a+1, a+1+n, cmp);
int l=1, r=n, ans = -1;
while(l <= r)
{
int mid = (l+r)>>1;
if(check(mid))
ans=mid,r=mid-1;
else l=mid+1;
}
cout<<ans<<endl;
return 0;
}