HDU 6581 Vacation
题目大意:Tom所处的车是0号车,道路是单行道,不能超车,Tom前面有n辆车,每辆车都有l, s, v三种属性,分别代表车长,车头距离终点线的距离,车的最大速度。当一辆车没有追上前面的车时,这辆车以最大速度行驶,当追上前车时(前车车尾和这俩车车头距终点线距离相等),这辆车以前车的速度继续行驶。所有车子过了终点线后仍然会行驶,求Tom的车到终点线(车头到终点线)的最短时间。答案要精确到1e-6。
有两种解法,比较直观的应该是二分,直接二分时间来得到答案。
二分解法:
由于头车不受阻挡,可以一直以全速前进,在特定的时间点,我们可以求出头车距离终点线的距离,从而可以向后递推出后面每一辆车距离终点线的距离。而且可以轻松得出一个结论:时间越大,0号车走的路程也必定越长,有单调性。
对于第i辆车在时间点t,有
dis[i] = max(s[i] - t * v[i], dis[i + 1] + l[i + 1])
dis[i]表示i号车距离终点线的距离, i + 1号车是前一辆车
通过最后的dis[0]来check 0号车和终点线间的状态
if (dis[0] > 0) l = mid; //没到终点线,扩大范围
else r = mid;
而且我们dis[i]的状态只和dis[i + 1]有关,把dis[]换成变量pos滚动即可
代码如下:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue