题目大意:
有n+1辆车,你是排在最后的一辆,每辆车有三个参数si,vi,li,分别表示距离终点的距离,最高速度,以及车长,由于车道很窄,所以不能超车,也就是当你追上前面的车时,速度就得跟他一样,现在让我们求我们通过终点的时间。
题目链接:
题目分析:
实数二分时间,首先默认可以超车,算出每个车的位置,然后倒着算出每个车的实际位置,看是否能过终点,把精度放到10^-8就能过了
代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
const int maxm=1e5+100;
const double eps=1e-8;
struct node{
double l,s,v;
}a[maxm];
int n;
double dis[maxm];
double vmin=1e9+100;
void work()
{
vmin=1e9+100;
for(int i=1;i<=n+1;i++) scanf("%lf",&a[i].l);
for(int i=1;i<=n+1;i++) scanf("%lf",&a[i].s);
for(int i=1;i<=n+1;i++) scanf("%lf",&a[i].v),vmin=std::min(vmin,a[i].v);
if(n==0) printf("%.10lf\n",a[1].s/a[1].v);
if(n==0) return;
double l=0,r=a[1].s/vmin;
while(r-l>eps)
{
double mid=(l+r)/2.0;
for(int i=n+1;i>=1;i--) dis[i]=a[i].s-a[i].v*mid;
for(int i=n;i>=1;i--) if(dis[i]<dis[i+1]+a[i+1].l) dis[i]=dis[i+1]+a[i+1].l;
if(dis[1]<0) r=mid;
else l=mid;
}
printf("%.10lf\n",l);
}
int main()
{
while(scanf("%d",&n)!=EOF) work();
return 0;
}