二分查找的问题
题意为
n衣服有a滴水,烘干每分钟为k滴 不烘干为每分钟1滴
问衣服干的最短时间。
注意一个是这个题最后求得是整数分钟,因此过程中要用ceil来向上取整求衣服烘所需要的时间
另外问题要用long long 不然会wa
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
typedef long long LL;
const int M=100005;
LL s[M];
bool isd(LL t,int n,LL k) //t时间衣服都干了吗
{
LL co=0;
for(int i=0;i<n;i++)
{
if(s[i]>t)
co+=ceil((s[i]-t)*1.0/(k-1)); //额外烘干用的时间
}
return co<=t;
}
LL bs(int n,LL maxs,LL k)
{
LL lo=0,hi=maxs;
LL mid,ans;
while(lo<=hi)
{
mid=(lo+hi)/2;
if(isd(mid,n,k))
{
ans=mid; //此时mid满足衣服全干,但是mid可能偏大
hi=mid-1;
}
else
lo=mid+1;
}
return ans; //注意这里的返回
}
int main()
{
int n;
LL k,maxs;
while(scanf("%d",&n)!=EOF)
{
maxs=0;
for(int i=0;i<n;i++)
{
scanf("%lld",&s[i]);
maxs=max(maxs,s[i]);
}
scanf("%lld",&k);
if(k==1)
{
printf("%lld\n",maxs);
continue;
}
else
printf("%lld\n",bs(n,maxs,k));
}
return 0;
}