•题意
有编号0到n,n+1辆车排队过红绿灯,从0到n离交通灯线越来越近
每辆车都有一个最大速度v,车身长度l,和离交通灯线的距离s,
一辆车头到达线则说明这辆车已到达线
如果一辆车前面没有紧邻着一辆车,那么这辆车可以以最大速度行驶
如果前面紧邻着一辆车,则车头贴着前一辆车尾行驶,不能超车!
即使过了交通灯线也不能超车!
问第0辆也就是离线最远的一辆,到达线的最短时间
•思路
既然不能超车,那么最远的车到线时有两种可能
①自己到线 $t=\frac{s_{0}}{v_{0}}$
②接在第p辆车后面到线 $\frac{s_{p}+\sum_{1}^{p}l_{i}}{v_{p}}$
解释一下接在某辆车后面为什么是这样算
假设有两辆车$a_{1}$速度为$v$,$a_{0}$速度为$2v$
当前面的车到达$p$点时,同时后面的车到达${p}'$ ,两者所花时间相同
同理可知
当$a_{1}$到达$O$点时,$a_{0}$到达$l_{1}$点,也就是$a_{0}$离终点线的距离是$a_{1}$的车长
②式也就是如果连在了第$p$辆车后面($p$后面的车全都连起来了)
当第$p$辆车到达终点线时,最远的一辆车离终点线的距离就是$p$后面所有车的车长-最后一辆车自身车长
也就是$sum=\sum_{1}^{p}l_{i}$
所以行驶的时间就是$p$车行驶时间+最远的车以$v_{p}$行驶$sum$的时间即$\frac{s_{p}}{v_{p}}+\frac{\sum_{1}^{p}l_{i}}{v_{p}}$
由于接在那辆车后面不确定,所以可以算最大的时间,
行驶时间长说明速度慢,后面速度快的肯定会接在他后面
•代码
View Code1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e6+6; 4 double l[maxn],s[maxn],v[maxn]; 5 double sum[maxn]; 6 int main() 7 { 8 int n; 9 while(~scanf("%d",&n)) 10 { 11 for(int i=0;i<=n;i++) 12 { 13 scanf("%lf",&l[i]); 14 if(i==0) 15 continue; 16 sum[i]=sum[i-1]+l[i]; 17 } 18 for(int i=0;i<=n;i++) 19 scanf("%lf",&s[i]); 20 for(int i=0;i<=n;i++) 21 scanf("%lf",&v[i]); 22 23 ///单独过终点 24 double ans=s[0]/v[0]; 25 26 ///排队过终点 27 for(int i=1;i<=n;i++) 28 ans=max(ans,(s[i]+sum[i])/v[i]); 29 30 printf("%.10f\n",ans); 31 } 32 }