POJ 3232

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

题解:二分答案,通过在这个时间内加速器能够使用的个数来进行判断。

View Code
 1 #include<cstdio>

 2 #include<cstring>

 3 #include<algorithm>

 4 using namespace std;

 5 const int N=100005;

 6 int a[N],n,m,k;

 7 bool check(int ti)

 8 {

 9     long long tot=(long long)ti*m;

10     for(int i=0;i<n;i++)

11     {

12         if(a[i]>ti)

13         {

14             if(k==1)

15                 return false;

16             int tp=(a[i]-ti)/(k-1)+((a[i]-ti)%(k-1)!=0);

17             if(tp>ti)

18                 return false;

19             tot=tot-tp;

20             if(tot<0)

21                 return false;

22         }

23     }

24     return true;

25 }

26 int main()

27 {

28     int T;

29     for(scanf("%d",&T);T;T--)

30     {

31         scanf("%d",&n);

32         for(int i=0;i<n;i++)

33             scanf("%d",&a[i]);

34         scanf("%d%d",&m,&k);

35         int ll=0,rr=200000000,mid,ans=rr;

36         while(ll<=rr)

37         {

38             mid=(ll+rr)>>1;

39             if(check(mid))

40             {

41                 ans=mid;

42                 rr=mid-1;

43             }

44             else

45             {

46                 ll=mid+1;

47             }

48         }

49         printf("%d\n",ans);

50     }

51     return 0;

52 }

你可能感兴趣的:(poj)