题目链接:POJ - 3104
题意:有n件湿衣服,分别给出其含水量。若衣服放在空气中,每分钟含水量会减少1;若把衣服放进烘干器里面则含水量每分钟会减少k,当衣服含水量为0时说明衣服已经干了,现在问要至少经过多少分钟能使所有的衣服都干了
思路:设每件衣服要
mid
m
i
d
分钟干,其中包括机器烘干
x
x
分钟,则空气蒸发分钟,则有关系式:
x∗k+(mid−x)≥a[i]
x
∗
k
+
(
m
i
d
−
x
)
≥
a
[
i
]
,即
x≥a[i]−midk−1
x
≥
a
[
i
]
−
m
i
d
k
−
1
,将所有衣服的机器烘干时间求和即总共经过的时间(!!!这里要仔细想想,最好的情况是不是机器一直都没停,直到衣服都干了,那总时间不就是机器烘干的时间了),如果机器烘干时间不大于
mid
m
i
d
,说明还没有充分利用好机器,时间还可以在减少,这样二分下去直到找到时间的最小值。注意,当
k=1
k
=
1
时直接输出最大值。
AC代码:
//一般到了9次方的数量级,最好定义long long类型,否则可能WA
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
#define maxn 100010
LL k,a[maxn];
int n;
void solve(LL l,LL r)
{
while(l<r)
{
LL mid=l+(r-l)/2,sum=0;
for(int i=0; i<n; i++){
if(a[i]>mid) sum+=ceil((a[i]-mid)*1.0/(k-1));//向上取整
}
if(sum<=mid) r=mid;
else l=mid+1;
}
printf("%lld\n",l);
}
int main()
{
while(~scanf("%d",&n)){
memset(a,0,sizeof(a));
LL x=0;
for(int i=0; i<n; i++){
scanf("%lld",&a[i]);
x=a[i]<x?x:a[i];
}
scanf("%lld",&k);
if(k==1) {printf("%d\n",x);continue;}
solve(0,x);
}
return 0;
}