首页 > 代码库 > codeforces 701 D. As Fast As Possible(数学题)

codeforces 701 D. As Fast As Possible(数学题)

题目链接:http://codeforces.com/problemset/problem/701/D

题意:给你n个人,每个人走路的速度v1,有一辆车速度为v2,每次可以载k个人,总路程为l,每个人只能上一次车,问最少需要多少时间把所有人送到终点

 

题解:首先要使的时间最短肯定是所有人同时到达终点,那么肯定每人坐车的时间是相同的。

不妨设一下车一趟来回的时间为t,乘车距离为a。可以得到

(l-a)/v1+a/v2=t*(gg-1)+a/v2(意思就是最后一批人乘车到达终点时所有人同时到达终点)

也就是说我们要求的是(l-a)/v1+a/v2,那么就要把a表示出来。

t*v1=a-(t-a/v2)*v2(在车来回的这段时间里剩下的人走了t*v1,(t-a/v2)*v2表示车回来开了多远的路)

结合两个式子可以得到a=l*(v1+v2)/(v1+v2+2*v1(gg-1))

然后就可以得到答案了。

 

#include <iostream>#include <cstring>#include <cstdio>using namespace std;int main() {    int n , l , v1 , v2 , k;    scanf("%d%d%d%d%d" , &n , &l , &v1 , &v2 , &k);    int gg = n / k + (n % k ? 1 : 0);    double a = 1.0 * l * (v1 + v2) / (1.0 * (v1 + v2 + 2 * v1 * (gg - 1)));    printf("%.10lf\n" , a / (1.0 * v2) + (1.0 * l - a) / (1.0 * v1));    return 0;}

codeforces 701 D. As Fast As Possible(数学题)