题意:有一些衣服要晾干,你有一个吹风机可加快晾干速度,问最少多长时间
思路:二分需要的时间,检查在需要的时间内没见衣服能否晾干,如不能晾干,则用吹风机,并计算使用吹风机的时间,(注意这里有几个坑),两种时间的比较作为二分的条件
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<cstring>
typedef long long ll;
using namespace std;
ll a[100005];
ll n,d,k;
int main()
{
//freopen("in.txt","r",stdin);
ll n;
while(scanf("%lld",&n)!=EOF)
{
ll ma=0; //用于保存最大值,不要忘记赋初值啊啊啊啊啊啊
for(ll i=0;i<n;i++)
{
scanf("%lld",&a[i]);
ma=max(a[i],ma);
}
scanf("%lld",&k);
if(k==1)
{
printf("%lld\n",ma);
continue;
}
ll low=1,high=ma,mid=0,sum=0,ans=0;
while(high>=low)
{
sum=0;
mid=(high+low)/2;
for(ll i=0;i<n;i++)
{
ll tmp=a[i]-mid;
if(tmp>0)
sum+=(tmp%(k-1)==0?tmp/(k-1):tmp/(k-1)+1);//注意这里是k-1,不是k
//sum+=ceil(tmp*1.0/(k-1)); //两个式子意义相同,经测试,上式稍微快一点
}
if(sum<=mid)
{
ans=mid; //注意保存有效的mid值,else情况下sum的取值会大于mid,不符合实际
high=mid-1;
}
else
low=mid+1;
}
printf("%lld\n",ans);
}
}