Drying
POJ - 3104It is very hard to wash and especially to dry clothes in winter. But Jane is a very smart girl. She is not afraid of this boring process. Jane has decided to use a radiator to make drying faster. But the radiator is small, so it can hold only one thing at a time.
Jane wants to perform drying in the minimal possible time. She asked you to write a program that will calculate the minimal time for a given set of clothes.
There are n clothes Jane has just washed. Each of them took ai water during washing. Every minute the amount of water contained in each thing decreases by one (of course, only if the thing is not completely dry yet). When amount of water contained becomes zero the cloth becomes dry and is ready to be packed.
Every minute Jane can select one thing to dry on the radiator. The radiator is very hot, so the amount of water in this thing decreases by k this minute (but not less than zero — if the thing contains less than k water, the resulting amount of water will be zero).
The task is to minimize the total time of drying by means of using the radiator effectively. The drying process ends when all the clothes are dry.
The first line contains a single integer n (1 ≤ n ≤ 100 000). The second line contains ai separated by spaces (1 ≤ ai ≤ 109). The third line contains k (1 ≤ k ≤ 109).
Output a single integer — the minimal possible number of minutes required to dry all clothes.
sample input #1 3 2 3 9 5 sample input #2 3 2 3 6 5Sample Output
sample output #1 3 sample output #2 2
题意:有n件衣服,若自然风干,则每分钟减少1单位水,若烘干,每分钟减少k单位水(烘干时不再考虑自然风对其影响),每次只能选取一件衣服进行烘干,问最少需要多长时间将所有衣服烘干。
思路:通过二分查找,mid为我们尝试的答案,当k=1是,答案应该为数组里的最大值。当k!=1时,我们可以发现,比mid小或等于mid的衣服可以直接忽略,因为这些衣服可以自然干,剩下的衣服也可以都减去mid,然后将剩下的也就是b[i]与k进行运算,计算出需要多少时间。计算公式的推出:设将一件衣服弄干,共需要x分钟,设烘干的时间为y,则自然干的时间为(x-y),将衣服弄干的条件即为k*y+(x-y)>= a [i],化简为:y*(k-1)+x >= a[i],因此y = (a[i]-x)/(k-1)。
AC代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<algorithm>
#define maxn 100010
#define LL long long
using namespace std;
LL a[maxn],b[maxn];
LL n,k;
bool ck(LL x)
{
for(LL i=1;i<=n;++i) b[i] = a[i]-x;
LL cnt = 0;
for(LL i=1;i<=n;++i){
if(b[i]>0){
if(b[i]%(k-1)==0) cnt+=b[i]/(k-1);
else {cnt+=b[i]/(k-1);cnt++;}
}
}
if(cnt>x) return true;
else return false;
}
int main()
{
while(scanf("%lld",&n)!=EOF){
for(LL i=1;i<=n;++i){
scanf("%lld",&a[i]);
}
sort(a+1,a+1+n);
scanf("%lld",&k);
if(k==1){printf("%lld\n",a[n]);continue;}
LL l=0,r=a[n],mid=0;
while(l<r-1){
mid = l+(r-l)/2;
if(ck(mid)) l = mid;
else r = mid;
}
printf("%lld\n",r);
}
return 0;
}