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

 

你可能感兴趣的:(poj)