链接:点击打开链接
题意:有n件湿衣服和一个烘干机,现在想要把它们都烘干,如果使用烘干机每分钟可以去除k单位的水,如不使用烘干机每分钟也会自然掉1单位的水,给出n件衣服的含水量,求出最少用多长时间可以全部烘干
代码:
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
const long long INF=0x3f3f3f3f;
long long a[100005];
long long n,k;
long long judge(long long t){ //t是用了多长时间,因为不用烘干机时每分钟也会掉一单位水
long long i,sum; //所以a[i]<=t时,不用考虑这类的衣服它自己也会干,因而问
sum=0; //题变为总共用了多长时间的烘干机,假设用了x单位的烘干机
for(i=0;i<n;i++) //因此k*x+(t-x)>=a[i],推出x>=(a[i]-t)/(k-1),从而求出使
if(a[i]>t) //用烘干机的总时间
sum+=(long long)(ceil((a[i]-t)*1.0/(k-1)));
return sum;
}
int main(){
long long i,l,r,ans,mid;
while(scanf("%I64d",&n)!=EOF){
l=r=ans=0;
for(i=0;i<n;i++){
scanf("%I64d",&a[i]);
r=max(a[i],r);
}
scanf("%I64d",&k);
if(k==1){ //k==1时相当于烘干机没有用,所以输出
printf("%I64d\n",r); //最大时间即可
continue;
}
while(l<=r){ //二分时间
mid=(l+r)/2;
if(judge(mid)<=mid){
ans=mid;
r=mid-1;
}
else
l=mid+1;
}
printf("%I64d\n",ans);
}
return 0;
}