HDU 6581 Vacation 思维或者二分答案

该博客介绍了HDU 6581 Vacation问题的两种解法,包括二分解法和O(n)的思维解法。二分法通过不断调整时间并计算车距离终点线的距离来寻找最短时间。O(n)的解法则是枚举0号车与前面车辆共速的情况,计算通过终点的时间并取最大值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值