先简化题目,假设只有两辆车,有两种情况:
(1)不论那辆车快,后车追不上,所以时间是后车距离终点距离/后车速度;
(2)后车能追上,这样前车限制了后车速度,所以后车的时间是前车的时间+前车车身长度/前车速度(前车过线了只是车头过线,车身还没过线)。
所以只需要枚举N+1辆车最长时间即可。
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
double l[100005],s[100005],v[100005],sum[100005];
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(sum,0,sizeof(0));
scanf("%lf",&l[1]);
for(int i=2;i<=n+1;i++)
{
scanf("%lf",&l[i]);
sum[i]=sum[i-1]+l[i];//是从最后一辆车开始输入的,sum数组代表这辆车的后面有多少车
}
for(int i=1;i<=n+1;i++)
{
scanf("%lf",&s[i]);
}
for(int i=1;i<=n+1;i++)
{
scanf("%lf",&v[i]);
}
double ans=0;
for(int i=1;i<=n+1;i++)
{
ans=max(ans,(s[i]+sum[i])/v[i]);//最慢那辆车的时间s[i]/v[i]+最慢那辆车到最后一辆车所有车身长度和sum[i]/v[i]
}
printf("%.10f\n",ans);
}
return 0;
}