题意:有一个含有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 }