小车问题

题目描述 Description
甲、乙两人同时从A地出发要尽快同时赶到B地。出发时A地有一辆小车,可是这辆小车除了驾驶员外只能带一人。已知甲、乙两人的步行速度一样,且小于车的速度。问:怎样利用小车才能使两人尽快同时到达。
 输入输出格式 Input/output
输入格式:
仅一行,三个数据分别表示AB两地的距离s,人的步行速度a,车的速度b。
输出格式:
两人同时到达B地需要的最短时间,保留6位小数。
 输入输出样例 Sample input/output
样例测试点#1
输入样例:
120 5 25
输出样例:
9.600000
思路:刚开始想这题时我想到用动态规划,但仔细想想又好像不对,还是用数学的方法来解方便点。
这题需要考虑的问题是:该怎样放人、载人才能到达B地且时间最少,后来我仔细想想,只用在某一个地方放人下去(就是说只用交换一次)。
现在的问题就变为了:该在哪个地方放人下去,带回终点,两人一起到终点,时间最少(首先车带一个人行驶一段距离然后丢下,折回找另外一个人,半路碰上,带回终点刚好与第一人共到B点)
这样问题就好解决了,设那个放下的点为x,那么就有:(s-x)/a=2*(2*x/(a+b)-x/b)+(s-x)/b
                                                                                     化简得:x=(b+a)*s/(b+3a)
既然放下的那个点已经确定好了,那么时间也简单了,时间为:x/b+(s-x)/a,(x/b)为那个点前一段所用的时间,[(s-x)/a]为那个点后一段所用的时间。
代码如下:
 1 #include<stdio.h>
 2 int main()
 3 {
 4     double s,a,b;
 5     double x;
 6     scanf("%lf%lf%lf",&s,&a,&b);
 7     x=(b+a)*s/(b+3*a);
 8     printf("%.6lf\n",x/b+(s-x)/a);
 9     return 0;
10 } 

提示:这些数必须得用double类型的,否则会“-1.#IND00”(无效浮点数)的。

posted @ 2015-02-22 12:12  Memoryヾノ战心  阅读(948)  评论(0编辑  收藏  举报