P1258 小车问题
题目描述
甲、乙两人同时从A地出发要尽快同时赶到B地。出发时A地有一辆小车,可是这辆小车除了驾驶员外只能带一人。已知甲、乙两人的步行速度一样,且小于车的速度。问:怎样利用小车才能使两人尽快同时到达。
输入输出格式
输入格式:
仅一行,三个数据分别表示AB两地的距离s,人的步行速度a,车的速度b。
输出格式:
两人同时到达B地需要的最短时间,保留6位小数。
输入输出样例
输入样例#1:
120 5 25
输出样例#1:
9.600000
----------------------------------------------------------------------------------------------------
思路:二分答案
首先要找到需要二分的变量:
小车先把甲运到某一个位置C(0<C<s),然后小车返回去找乙,期间甲乙都继续向前走,当小车接到乙后,以b的速度赶往B点。甲全程用的时间为t1,乙为t2。
那么C就是我们需要二分的变量。
因为t1与t2都往相等无限逼近,所以二分的临界条件便是abs(t1-t2)小于某个精度,这里设为0.0000001。
![](https://img2018.cnblogs.com/blog/1556843/201901/1556843-20190117210046768-1630340758.png)
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> using namespace std; double s,a,b,l,r; long long read() { long long x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } inline double work1(double mid) { double ans=0; ans+=mid/b; ans+=(s-mid)/a; return ans; } inline double work2(double mid) { double ans=0; ans+=mid/b; ans+=(mid-(mid/b)*a)/(a+b); ans+=(s-((mid-(mid/b)*a)/(a+b)*a+((mid/b)*a)))/b; return ans; } inline bool check(double x,double y) { return x>y; } int main() { s=read();a=read();b=read(); l=1;r=s; while(l<=r) { double t1=0,t2=0; double mid=(l+r)/2; t1=work1(mid);t2=work2(mid); if(check(t1,t2)) l=mid; else r=mid; if(abs(t1-t2)<0.0000001) { printf("%.6f",t1); return 0; } } }
复杂度:(logn*log1000000)