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