甲、乙两人同时从 A 地出发要尽快同时赶到 B 地。出发时 A 地有一辆小车,可是这辆小车除了驾驶员外只能带一人。已知甲、乙两人的步行速度一样,且小于车的速度。问:怎样利用小车才能使两人尽快同时到达。
输入格式
仅一行,三个整数,分别表示 A、B 两地的距离s (1≤s≤2000) 米,人的步行速度 a 米/秒,车的速度 b米/秒,a<b<2000。
输出格式
两人同时到达 B 地需要的最短时间,单位秒,保留 2 位小数。
Sample Input
120 5 25
Sample Output
9.60
解题思路:
法一:(数学分析)
因为甲乙到终点的时间相同并且要求最短,则二人走和坐车的时间相等,即走和坐车的路程相同,并且车只回去接一次。
|--x----|----s-2*x-----|---x----|
设人走的路程为x,时间为t1,坐车路程为s-x,时间为t2,车回去接人的时间为t3,总共耗时为t。
人走的时间=车回去接另一个人的时间+另一个人坐车的时间。即t1=t2+t3,即x/a=(s-2*x)/b+(s-x)/b,得x=2*a*s/(3*a+b),时间为x/a+(s-x)/b。
法二:二分
t1为车载甲到甲下车的时间,t2为车返回去接乙的时间,t1+t2时间内乙一直在步行
m(甲用的时间),n(乙用的时间)
m<n的话,不公平啦~,说明甲坐车的时间长(快),mid(甲下车的地方)应该小一点,故r=mid
反之,l=mid;直到r-l小于某一误差值。
代码:
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
double s,a,b;
bool check(double mid)
{
double t1=mid/b;
double t2=(mid-t1*a)/(a+b);
double m=t1+(s-mid)/a;
double n=t1+t2+(s-(t1+t2)*a)/b;
return m<n;
}
int main()
{
cin>>s>>a>>b;
double l=0,r=s;
while (r-l>1e-8)
{
double mid=(l+r)/2.0;
if (check(mid)) r=mid;
else l=mid;
}
printf ("%.2f",l/b+(s-l)/a);
return 0;
}
这位博主写的更加清晰易懂~是一只派大鑫