poj 3232 Accelerator

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

题意:有一个含有n辆车的车队,当前距离终点的距离已知,有m个加速器,每个加速器在一个时刻只能给一辆车用,一旦使用就会使得其速度由1变成k,加速器可以重复使用,问最快所有车辆到达终点的时间。

思路:二分枚举所需的最短时间。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #define maxn 300000
 5 #define ll long long
 6 using namespace std;
 7 
 8 ll t,n,m,k;
 9 ll a[maxn];
10 
11 bool ok(ll c)
12 {
13     ll cnt=0,x=c*m;
14     for(int i=0; i<n; i++)
15     {
16         if(a[i]<=c) continue;
17         if((a[i]-c)%(k-1)==0)
18         cnt=((a[i]-c)/(k-1));
19         else
20         cnt=((a[i]-c)/(k-1))+1;
21         if(cnt>c) return false;
22         x-=cnt;
23         if(x<0) return false;
24     }
25     return true;
26 }
27 
28 
29 int main()
30 {
31     scanf("%lld",&t);
32     while(t--)
33     {
34         scanf("%lld",&n);
35         ll max1=0;
36         for(int i=0; i<n; i++)
37         {
38             scanf("%lld",&a[i]);
39             max1=max(max1,a[i]);
40         }
41         scanf("%lld%lld",&m,&k);
42         ll l=0,r=max1;
43         if(k==1)
44         {
45             printf("%lld\n",max1);
46             continue;
47         }
48         int mid;
49         while(l<r)
50         {
51             mid=(l+r)>>1;
52             if(ok(mid))
53             {
54                 r=mid;
55             }
56             else l=mid+1;
57         }
58         printf("%lld\n",l);
59     }
60     return 0;
61 }
View Code

 

posted @ 2014-09-25 19:56  null1019  阅读(162)  评论(0编辑  收藏  举报