【9703】小车问题

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\n", ans);
    return 0;
}
posted @ 2017-10-04 18:45  AWCXV  阅读(152)  评论(0编辑  收藏  举报