题意:

有n+1辆车,在一条单车道上(假设车道方向从左到右,车头向右), 在终点线的左边,他们按照1,2,....,n,n+1  从右到左在终点线的左边,每辆车有三个属性 s(车头到终点线的距离), l(车子本身的长度), v (车的最大速度),不能超车,请问第n+1辆车最快什么时候车头能碰到终点线。

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=6581

题解:

最终通过终点线的时候,一定是一个车后面堵着剩余所有的车,不同车超过终点线停止的位置也不同,那么影响时间的就只有最前面这辆车。最前面这辆车没有被其他车限制,所以他可以按他的最大速度行驶,根据这个时间来限制后面的车速,每一辆车都会被他的前一辆车的速度所限制,那我们最从最右边的车开始计算,不同计算出不同车到达停止位置所需要的最大时间,进行更新,时间复杂度是O(n)。

AC_code:

#include<bits/stdc++.h>
#define maxn 100005
using namespace std;
int l[maxn], v[maxn], s[maxn];

int main() {
    int n;
    while(~scanf("%d", &n)) {
        for(int i = 0; i < n+1; i++) {
            scanf("%d", &l[i]);
        }
        for(int i = 0; i < n+1; i++) {
            scanf("%d", &s[i]);
        }
        for(int i = 0; i < n+1; i++) {
            scanf("%d", &v[i]);
        }
        long long sum = 0;
        for(int i = 1; i < n+1; i++) {
            sum += l[i];
        }
        double ans = 0.0;
        for(int i = n; i >= 0; i--){
            long long h = sum +s[i];
            double t = h * 1.0 / v[i];
            ans = max(ans, t); 
            sum -= l[i];
        }
        printf("%.10lf\n", ans);
    }
    return 0;
}