您的位置:首页 > 其它

POJ3104 Drying

2013-04-11 01:03 211 查看
题目链接:http://poj.org/problem?id=3104

这道题是我做的第一道二分枚举答案的题吧,可是实际上做的也不怎么样……

首先二分枚举答案,也就是最短时间,如果a[i]<t的话直接让它自然风干就行,如果大于t就计算使用几次风干器,假设x1是自然风干时间,x2是使用风干器的次数,那么x1+x2=t,x1+x2*k=a[i],两个方程联立,求出来使用的次数应该是(a[i]-t)/(k-1)的上界,所以把所有的使用散热器和自然风干的时间加到一起,和枚举的答案比较,然后继续二分就行。

#include <cstdio>
#include <cmath>
int maxt, t, a[100100], k, n;
bool check(int tt){
double rt = 0;
for (int i = 0; i < n; i++)
if (a[i] > tt) rt += ceil(double(a[i] - tt) / double(k - 1));
if (rt <= tt) return 1;
else return 0;
}
void solve(){
int l = 0, r = maxt;
while (l <= r){
int m = (l + r) >> 1;
if (check(m)){
if (!check(m - 1)){
t = m; return;
}
r = m - 1;
}
else l = m + 1;
}
}
int main(){
while (~scanf("%d", &n)){
maxt = 0;
for (int i = 0; i < n; i++){
scanf("%d", &a[i]);
if (a[i] > maxt) maxt = a[i];
}
scanf("%d", &k);
solve();
printf("%d\n", t);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: