Time Limit: 3 second
Memory Limit: 2 MB
【问题描述】
甲、乙两人同时从A地出发要尽快同时赶到B地。出发时A地有一辆小车,可是这辆小车除了驾驶员外只能带一人。已知甲、乙两人的步行速度一样,且小于车的速度。问:怎样利用小车才能使两人尽快同时到达。
【输入格式】
仅一行,三个数据分别表示AB两地的距离S,人的步行速度a,车的速度b。
【输出格式】
两人同时(到达时间差小于0.00001)到达B地需要的最短时间,保留4位小数。
【输入样例】
120 5 25
【输出样例】
9.6000
【题目链接】:http://noi.qz5z.com/viewtask.asp?id=9703
【题解】
之前在CF上做过的一道类似题的迷你版;
那题是有n个人,每个人都能坐车,且车可以载k个人;问到终点的最短时间;(给你长度l和每个人的走路速度以及在车上的速度);
具体的看这个;
http://blog.csdn.net/harlow_cheng/article/details/52821115
每个人在车上的时间是一样的;在车上的路程也是一样的;
车到终点经过的时间和人到终点经过的时间也是一样的;
(车先载第一波人到一个位置,然后回头载另外一个人,然后车上的人和走路的人一起到达终点);
假如每个人在车上的时间不同。
最后一波人到终点的时候,假设有人先到了终点则总是可以调整那堆人少坐一会车,最后这波人多做一会车以减少总时间;
设车载到第一个人然后又回来接到第二个人的时间间隔为△t
设第二个人原来的位置
为x,等车又返回载它们的时候位置变成x+△t*v1
则有
x+△t*v1=x+g-(△t-g/v2)*v2; ····①
右边的(△t-g/v2)*v2是这辆车接人到一个合适的位置后又往回走的距离;
根据①式可得
△t=(2g)/(v1+v2); ·····②
且有
△t+g/v2 = (l-g)/v1 + g/v2; ····③
左边是车到达的时间,右边是人到达的时间;
右边,(l-g)/v1就是每波人走路的时间了,g/v则是在车上的时间
左边的一个△t表示要接到一个人到某个位置后再回来接到那个人的时间;
然后再加上g/v2(最后坐车到终点);
由③式,将②式代入可得
g= l(v1+v2)/(2*v1+v1+v2);
答案就是(l-g)/v1 + g/v2;
【完整代码】
#include <cstdio>
int n;
double l, v1, v2;
int main()
{
scanf("%lf%lf%lf", &l, &v1, &v2);
int n = 2;
double g = (l*(v1 + v2)) / (2 * v1 + v1 + v2);
double ans = (l - g) / v1 + g / v2;
printf("%.4lf
", ans);
return 0;
}