这道题最关键的地方在这:
意思就是这些车的距离是0;
并且无论你开多快,你只能和前面的并起走;
然后求车头过终点线的最短时间;
题目的案例给的是每个车的长度l和每个车头部距离终点长度s和他能行驶的最大速度v;
那么最好想的一种就是这个距离终点最远的车单独自己到达终点时那么时间就是t=s0/v0;
但是如果这辆车和他前面的车相连接后,那么他的速度一定会减小(因为能和前面车想链接说明肯定原速度更大);所以他会跟着他前面的车一直到终点,那么因为在连接之前他们是同时间在走,所以最后影响时间的就是前面和他连接的车,比如这种:
那么时间肯定就等于L1所运动的时间(注意这里需要加上L1);这里可以在头脑里面动态想一想就明白了;同样按照这种推理,那么我只需要记录每个车到终点所用时间的最大值就够了,因为合并之后肯定会被前面的慢的影响,慢的自然时间就大了,所以这就能解释清楚了;这里还有一点需要注意:就是我在算t时我是里面包含的车的长度;意思就是这个意思:
动态想一想应该可以理解的;
这里就把多走的时间算出来
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
double eps=1e-8;
const int maxn=1e5+10;
ll Mod=998244353;
ll gcd(ll a,ll b){
return b?gcd(b,a%b):a;
}
struct Car{
int l,s,v;
}car[maxn];
int main(){
int n;
while(~scanf("%d",&n)){
for(int i=0;i<=n;i++)scanf("%d",&car[i].l);//输入L
for(int i=0;i<=n;i++)scanf("%d",&car[i].s);//输入S
for(int i=0;i<=n;i++)scanf("%d",&car[i].v);//输入最大V
double ans=(car[0].s)*1.0/(car[0].v*1.0);//这种是他独自跑完,意思就是不比前面车的速度都慢
double length=0;//这里用来记录L的累加结果
for(int i=1;i<=n;i++)length+=car[i].l*1.0,ans=max(ans,(length+car[i].s)*1.0/(1.0*car[i].v));//因为按照后面的车的到达时间之后,但是此时最远的车并未到达;
printf("%0.8lf\n",ans);
}
return 0;
}