POJ_3104_Drying

描述


http://poj.org/problem?id=3104

分析



二分.

最大化最小值.

y为原来的最大时间.然后二分可行时间x,如果有自然风干时间>x的,用吹分机加速,多出的时间用多的速度弥补,并向上取整,看吹风机是否够用.

注意:

1.k=1时,v=k-1=0,不能做除数.............要特判.........

 1 #include<cstdio>
 2 #include<algorithm>
 3 using std :: max;
 4
 5 const int maxn=100005;
 6 int n,k,x,y;
 7 int a[maxn];
 8
 9 bool C(int x)
10 {
11     int rest=x;
12     for(int i=1;i<=n;i++)
13     {
14         if(a[i]>x)
15         {
16             int d=a[i]-x;
17             int v=k-1;
18             int res=d/v;
19             if(d%v!=0) res++;
20             rest-=res;
21         }
22         if(rest<0) return false;
23     }
24     return true;
25 }
26
27 void solve()
28 {
29     while(x<y)
30     {
31         int m=x+(y-x)/2;
32         if(C(m)) y=m;
33         else x=m+1;
34     }
35     printf("%d\n",x);
36 }
37
38 void init()
39 {
40     scanf("%d",&n);
41     for(int i=1;i<=n;i++) { scanf("%d",&a[i]); y=max(y,a[i]); }
42     scanf("%d",&k);
43 }
44
45 int main()
46 {
47     freopen("dry.in","r",stdin);
48     freopen("dry.out","w",stdout);
49     init();
50     if(k==1)
51     {
52         printf("%d\n",y);
53         return 0;
54     }
55     solve();
56     fclose(stdin);
57     fclose(stdout);
58     return 0;
59 }

时间: 2024-10-30 08:09:28

POJ_3104_Drying的相关文章