1. 程式人生 > >codeforces 701 D. As Fast As Possible(數學題)

codeforces 701 D. As Fast As Possible(數學題)

1.0 我們 force 時間 tar 遠的 每次 space http

題目鏈接: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(數學題)