小练习记录贴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 0≤s,a,b≤109。
题目思路
一开始我的思路是找时间作为二分的目标,但是时间是一个统一的量,这是什么意思呢?就是说,必须要依靠时间来判断两个人有没有同时到达,所以时间是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;
}