題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6581
思路:1.最終通過停止線的時候,一定是一個車后面堵着剩余所有的車,那么影響時間的就只有最前面這輛車。由於這輛車始終速度不變,那么我們可以這樣計算答案:
從開始到結束這輛車總共要走 (初始離停止線的距離Si + 與 0 車之間夾着的車的長度 ∑Li )/ 這倆車的速度Vi.
2.所以對於每一輛車, 假設是它是和 0 車堵在一起的最靠前的一輛車,那么可以計算出一個值,所有的車的計算值的最大值就是答案。這個貪心挺難想的,我的理解是時間最長的車會堵住后面的車,在時間最長的車前面的車比它快所以不會卡住它。
AC代碼:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1e5 +5; 4 struct edge{ 5 double v,s,len; 6 }es[maxn]; 7 int main() 8 { 9 int n; 10 while(~scanf("%d",&n)) 11 { 12 int m = 1; 13 for(int i = 1;i <= n + 1;i++) scanf("%lf",&es[i].len); 14 for(int i = 1;i <= n + 1;i++) scanf("%lf",&es[i].s); 15 for(int i = 1;i <= n + 1;i++) scanf("%lf",&es[i].v); 16 double ans = 0; 17 double lazy = 0; 18 for(int i = 1;i <= n + 1;i++) 19 { 20 if(i != 1) lazy += es[i].len; 21 double t = (es[i].s + lazy) / es[i].v; 22 ans = max(t,ans); 23 } 24 printf("%.10f\n",ans); 25 } 26 return 0; 27 }