hdu 6851 Vacation(思维+贪心)

传送门

•题意

有编号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}}$

由于接在那辆车后面不确定,所以可以算最大的时间,

行驶时间长说明速度慢,后面速度快的肯定会接在他后面

•代码

 1 #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 }
View Code

猜你喜欢

转载自www.cnblogs.com/MMMinoz/p/11599937.html