题意:
有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;
}