題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6581
題意
在一條道路上有輛車,每輛車有自己距離終點的距離,自己的車身長度和自己的速度。注意所有的車不能超車,只能按照順序到達終點。問所有的車到達終點所需要的時間。數據按照從遠到近的順序給出。
題解
這是一個比較有意思的思維題。
- 考慮最遠的一輛車。就是編號爲0的車。如果在到達終點的期間沒有碰到一號車,那麼它就是最後一個到達是車,所需要的的時間就是。
- 如果遇到一號車(假設一號車沒有碰到其他的車)。那麼這兩車到達終點的時間取決了一號車(畢竟走的慢,0號車需要在後面跟着)。那麼需要的時間呢?
根據上面的兩個圖可以知道,一號車走的路程是(需要完全開過終點,0號車才能算到達終點)。所以時間爲
依次類推,如果一號車也碰到了二號車,那麼最終的時間就取決於二號車,時間爲
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1e5+10;
int l[maxn], v[maxn], s[maxn];
int main() {
int n;
while(~scanf("%d", &n)) {
for(int i = 0;i<=n;i++) {
scanf("%d",&l[i]);
}
for(int i = 0;i<=n;i++) {
scanf("%d", &s[i]);
}
for(int i= 0 ;i<=n;i++) {
scanf("%d", &v[i]);
}
double ans = s[0] * 1.0/ v[0];
long long sum =0 ;
for(int i =1 ;i<=n;i++) {
sum += l[i];
ans = max(ans, (sum + s[i])*1.0/v[i]);
}
printf("%.10f\n", ans);
}
return 0;
}