【45.61%】【codeforces 701D】As Fast As Possible
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
On vacations n pupils decided to go on excursion and gather all together. They need to overcome the path with the length l meters. Each of the pupils will go with the speed equal to v1. To get to the excursion quickly, it was decided to rent a bus, which has seats for k people (it means that it can’t fit more than k people at the same time) and the speed equal to v2. In order to avoid seasick, each of the pupils want to get into the bus no more than once.
Determine the minimum time required for all n pupils to reach the place of excursion. Consider that the embarkation and disembarkation of passengers, as well as the reversal of the bus, take place immediately and this time can be neglected.
Input
The first line of the input contains five positive integers n, l, v1, v2 and k (1 ≤ n ≤ 10 000, 1 ≤ l ≤ 109, 1 ≤ v1 < v2 ≤ 109, 1 ≤ k ≤ n) — the number of pupils, the distance from meeting to the place of excursion, the speed of each pupil, the speed of bus and the number of seats in the bus.
Output
Print the real number — the minimum time in which all pupils can reach the place of excursion. Your answer will be considered correct if its absolute or relative error won’t exceed 10 - 6.
Examples
input
5 10 1 2 5
output
5.0000000000
input
3 6 1 2 1
output
4.7142857143
Note
In the first sample we should immediately put all five pupils to the bus. The speed of the bus equals 2 and the distance is equal to 10, so the pupils will reach the place of excursion in time 10 / 2 = 5.
题解
数学问题.
最后的时间取决于最后一拨到终点的人的时间.
因此肯定是这样:先将一波人载到终点前的某个位置。
然后这辆车再回来载另外一拨人。然后两拨人(方便起见先假设只要载两次就能载完)同时到达终点。
这样是最优的方案。
可以肯定每个人在车上的时间是相同的,且所有人同时到达终点。
可以这么理解:
假如每个人在车上的时间不同。
最后一波人到终点的时候,假设有人先到了终点则总是可以调整那堆人少坐一会车,最后这波人多做一会车。
最后每个人在车上的时间就是相同的了,且所有人都能够同时到达终点。
同时到达可以这么理解,设所有人在车上经过的路程为g,则 (l-g)/v1 + g/v2为每个人最后到达的时间。如果在车上的时间相同则g相同,那么最后的时间也就相同了(l,v1,v2都是确定的量);
因为所有人在车上的时间是相同的。
则设所有人在车上经过的路程为g,一辆车从接到一波人开始,一直到它返回又接到第二波人的时间间隔为△t;第二拨人原来的位置
为x,等车又返回载它们的时候位置变成x+△t*v1
则有
x+△t*v1=x+g-(△t-g/v2)*v2; ····①
右边的(△t-g/v2)是这辆车接人到一个合适的位置后又往回走的距离;
根据①式可得
△t=(2g)/(v1+v2); ·····②
设r = (n/k)+((n%k)?1:0);
这个r就是这辆车需要载的趟数
则有
△t*(r-1)+g/v2 = (l-g)/v1 + g/v2; ····③
左边是车到达的时间,右边是人到达的时间;
(l-g)/v1就是每波人走路的时间了,g/v则是在车上的时间
右边r-1表示需要往返r-1次,然后最后一次直接把最后一拨人载到终点即可
由③式可得
g= l(v1+v2)/(2*v1(r-1)+v1+v2);
答案就是(l-g)/v1 + g/v2;
#include <cstdio>
int n,k,r;
double l, v1, v2;
int main()
{
scanf("%d%lf%lf%lf%d", &n, &l, &v1, &v2, &k);
r = n / k + ((n%k) ? 1 : 0);
double g = (l*(v1 + v2)) / (2 * v1*((r - 1)*1.0) + v1 + v2);
double ans = (l - g) / v1 + g / v2;
printf("%.10lf\n", ans);
return 0;
}