二分练习-小车问题

Anarticledetailingaproblem-solvingapproachusingtimebinningtofindtheshortesttimefortwopeopletoreachadestinationsimultaneously,utilizingacarasarelay.TheauthorpresentsaC++codeexample.

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

小练习记录贴01
本来想取名叫每日一题的,然而我恐怕很难坚持住啊。lol能坚持多久拭目以待吧。

点击跳转到原题

题目描述

甲、乙两人同时从 A 地出发要尽快同时赶到 B 地。出发时 A 地有一辆小车,可是这辆小车除了驾驶员外只能带一人。已知甲、乙两人的步行速度一样,且小于车的速度。问:怎样利用小车才能使两人尽快同时到达。

输入格式

仅一行,三个实数,分别表示 AB 两地的距离 s s s,人的步行速度 a a a,车的速度 b b b

输出格式

两人同时到达 B 地需要的最短时间,保留 6 6 6 位小数。

样例 #1

样例输入 #1

120 5 25

样例输出 #1

9.600000

提示

数据规模与约定

对于 100 % 100\% 100% 的数据,保证 0 ≤ s , a , b ≤ 1 0 9 0 \leq s, a, b \leq 10^9 0s,a,b109


题目思路

一开始我的思路是找时间作为二分的目标,但是时间是一个统一的量,这是什么意思呢?就是说,必须要依靠时间来判断两个人有没有同时到达,所以时间是if里面要判断的内容,就得换一个变量。
所以自然而然只能使用距离来作为二分的目标。

我们可以理解a和b从A地到B地,那么最快的方式是a先坐车,然后车撂下a,让a走着,车转而去接b,接到b后,车一路开到终点B,于此同时a也到了B。
在这里插入图片描述
具体过程就如上图所示。标记的①②是相同的时间段a和b的行为。

但是请注意,b在②时间段并没有直接被车接走
这是因为车撂下a之后折返接到b还需要一段时间,所以应该是这样的↓
在这里插入图片描述
理解了这个过程后,假设a坐车的距离为x,我们可以得到:

  • a整体耗费的时间 = 坐车的时间 + 走路的时间 = x / drive + (s - x) / walk
  • b整体耗费的时间 = a坐车时b走路的时间 + 车来接b时b走路的时间 + b坐车的时间

按照这个思路,我们只需要二分然后找到合适的x,以满足a整体耗费的时间==b整体耗费的时间

还有需要注意的一点,如何计算车来接b时b走路的时间?这个时间其实就是b和车相遇的时间,所以用那一段距离直接除以(走路速度+开车速度)即可。

AC代码

#include<iostream>
#include<cstdio>
using namespace std;

int main(){
	double s, walk, drive; cin >> s >> walk >>  drive;
	double a_t, b_t;
	double l = 0, r = s;
	while(r - l > 1e-6){
		double x = (l + r) / 2;
		double a_t1 = x / drive;
		double b_s1 = a_t1 * walk;
		double b_t2 = (x - b_s1) / (walk + drive);
		double b_t3 = (s - b_s1 -(b_t2 * walk))/drive;
		double a_t2 = (s - x) / walk; 
		a_t = a_t1 + a_t2;
		b_t = a_t1 + b_t2 + b_t3;
		if(a_t < b_t) r = x;//A到的时间比B到的时间早->A坐车坐多了->距离向左移动
		else l = x; 
	}
	printf("%lf",a_t);
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ayu阿予

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值