题目链接: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)的上界,所以把所有的使用散热器和自然风干的时间加到一起,和枚举的答案比较,然后继续二分就行。
view code
1 #include <cstdio>
2 #include <cmath>
3 int maxt, t, a[100100], k, n;
4 bool check(int tt){
5 double rt = 0;
6 for (int i = 0; i < n; i++)
7 if (a[i] > tt) rt += ceil(double(a[i] - tt) / double(k - 1));
8 if (rt <= tt) return 1;
9 else return 0;
10 }
11 void solve(){
12 int l = 0, r = maxt;
13 while (l <= r){
14 int m = (l + r) >> 1;
15 if (check(m)){
16 if (!check(m - 1)){
17 t = m; return;
18 }
19 r = m - 1;
20 }
21 else l = m + 1;
22 }
23 }
24 int main(){
25 while (~scanf("%d", &n)){
26 maxt = 0;
27 for (int i = 0; i < n; i++){
28 scanf("%d", &a[i]);
29 if (a[i] > maxt) maxt = a[i];
30 }
31 scanf("%d", &k);
32 solve();
33 printf("%d\n", t);
34 }
35 return 0;
36