小车问题
【问题描述】
甲,乙两人要同时从A地出发要尽快同时赶到B地。出发时A地有一辆小车,可是这辆小车除了驾驶员外只能带一人。已知甲,乙两人的步行速度一样,且小于车的速度。问:怎样利用小车才能使两人尽快同时到达。
【输入】
仅一行,三个数据分别表示AB两地的距离s,人步行的速度a,车的速度b。
【输出】
两人同时到达B地需要的最短时间。
【样例】
car.in
120 5 25
car.out
9.60000
【算法提示】
甲先乘车到达K处后下车步行,小车再回头接已走到C处的乙,在D处相遇后,乙再乘车赶往B地,最后甲,乙一起到达B地。这样问题就转换成了求K处的位置,我们用二分法,不断尝试,知道满足同时到达的时间精度。算法框架如下:
(1)输入s,a,b;
(2)c0=0;c1=s;c=(c0+c1)/2;
(3)求t1,t2;
(4)如果t1<t2,那么c=(c0+c)/2
否则c=(c+c1)/2;
反复执行(3)和(4),直到abs(t1-t2)满足精度要求(即小于误差标准)。
#include<stdio.h> #include<math.h> int main(){ float s,a,b,t1,t2; scanf("%f %f %f",&s,&a,&b); float k1=0,k2=s,k=0; do{ k=(k1+k2)/2; t1=k/b+(s-k)/a; //t2=k/b+k/(a+b)+(s-a*(k/b+k/(a+b)))/b; t2=(2*k*b/(a+b)+k)/b; if (t1<t2) k2=k; else k1=k; //printf("%.5f %.5f\n",t1,t2); }while (fabs(t1-t2)>1e-3); printf("%.5f %.5f\n",t1,t2); return 0; }