题解:
//数学计算+二分操作详解
//设对于每件衣服我们吹k次风
//mid=FinishTime,mid-k=自然风干的时间
//设每次吹m的水量
//故我们吹干的总水量=mid-k+k*m>=a[i]=每件衣服的水量
//得到每件衣服的最小吹风次数k=(a[i]-mid)/(m-1)
//由于在mid时间内我们最多吹风次数为mid
//所以我们要让sum尽可能的小而且可以满足操作
AC代码:
#include<bits/stdc++.h>
using namespace std;
int a[100005],m,n;
bool slove(int mid)
{
int sum=0;
for(int i=0;i<n;i++)
{
if(a[i]>mid)//小于操作时间的,都自然风干
{
sum+=(a[i]-mid)/(m-1);
if((a[i]-mid)%(m-1))
sum++;
if(sum>mid)
return false;
}
}
return true;
}
int main()
{
while(~scanf("%d",&n))
{
int r=-1;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i]>r)
r=a[i];
}
scanf("%d",&m);
if(m==1)//用吹风机吹省一分钟时和自然风干没区别
{
printf("%d\n",r);
continue;
}
int l=1,ans;
while(l<=r)//二分操作
{
int mid=(l+r)/2;
if(slove(mid))
{r=mid-1;
ans=mid;
}
else
l=mid+1;
}
printf("%d\n",ans);
}
}