题意:给出一堆衣服的水分a[i],在不加吹风机情况下自动每一分钟减少1水分,加吹风机每分钟减少k水分,吹风机只能同时吹一件衣服,求最少需要多少时间。
二分枚举所需时间m,对每一件衣服,a[i]<=m则不用吹风机,否则用 ceil((a[i] -mid)/(k-1))时间的吹风机,如用吹风机总时间小于等于m则m符合条件,二分找出最小m
需要特判k=1
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int n,k;
int a[100005];
int chk(int m)
{
long long cnt=0;
for(int i=0;i<n;i++)
{
if(a[i]>m)
{
cnt+=ceil((a[i]-m)*1.0/(k-1));
}
}
if(cnt>m)
return 0;
return 1;
}
int main()
{
int l,r,mid,ans=0;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&k);
sort(a,a+n);
if(k==1)
{
printf("%d\n",a[n-1]);
continue;
}
l=1;
r=a[n-1];
ans=0;
while(l<=r)
{
//printf("bs %d %d\n",l,r);
mid=(l+r)/2;
if(chk(mid)==1)
{
ans=mid;
r=mid-1;
}
else
{
l=mid+1;
}
}
printf("%d\n",ans);
}
return 0;
}