[HDU 6581] Vacation

题目大意:

有n+1辆车,你是排在最后的一辆,每辆车有三个参数si,vi,li,分别表示距离终点的距离,最高速度,以及车长,由于车道很窄,所以不能超车,也就是当你追上前面的车时,速度就得跟他一样,现在让我们求我们通过终点的时间。

题目链接:

HDU 6581

题目分析:

实数二分时间,首先默认可以超车,算出每个车的位置,然后倒着算出每个车的实际位置,看是否能过终点,把精度放到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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值