Drying
题目链接:Click Here~
题目分析:
给出N件带水的衣服,你有两种选择可以把某件衣服给弄干。一是用烘干机可以每分钟烤干衣服的K滴水。二是每分钟衣服会自然烘干一滴水。而用烘干机的时候就不再自然烘干了。而每件衣服所带的水滴是不一样多的。现在问你最少要多少时间可以把衣服全烘干。
思路分析:
先二分枚举时间。但是判断的条件有点难想到,一开始用暴力判断结果超时了。后来看了博客后才知道只要转换一下公式就可以了判断了。详细解释过程请看代码。
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int MAXN = 100000 + 10;
const int INF = ~0U >> 2;
int a[MAXN],sum[MAXN];
int N,K;
/*
假设烘干时间是x,则自然风干时间为mid - x
K*x + (mid - x) >= a[i]
x >= (a[i] - mid)/(K - 1) (K != 1)
*/
bool C(int mid){
unsigned long long sum(0);
for(int i = 0;i < N;++i){
int more = a[i] - mid;
if(more > 0){
sum += ceil(more + K - 1 / K); //ceil
}
}
return sum <= mid;
}
//二分时间
void solve(){
int lb = -1,ub = INF;
while(ub - lb > 1){
int mid = (lb + ub) / 2;
if(C(mid)) ub = mid;
else lb = mid;
}
printf("%d\n",ub);
}
int main()
{
while(~scanf("%d",&N)){
for(int i = 0;i < N;++i)
scanf("%d",&a[i]);
scanf("%d",&K);
if(K == 1){ //特判,防止分母为0
printf("%d\n",*max_element(a,a+N));
continue;
}
K--;
solve();
}
return 0;
}