牛客算法周周练1 B. 身体训练(概率/枚举)

题目链接:https://ac.nowcoder.com/acm/contest/5086/B

题意

$n$ 个人排成一列跑步,前后两人之间相隔 $u$ 米,每个人正常速度均为 $v$ 米/秒。
当某个人排在最后的时候,他需要以当时自己的最高速度往前跑,直到超过排头的人 $u$ 米,然后降回到原始速度 $v$ 米/秒。每个人最初的最高速度为 $c_i$ 米/秒,每轮衰减 $d_i$ 米/秒,也就是说,如果 $i$ 是第 $j$ 个跑的,那么他的速度就是 $c_i-(j-1)d_i$ 米/秒。
$n$ 个人初始以随机的顺序排列,每种顺序的概率完全相等,跑完一轮(每个人都追到排头一次,序列恢复原样)的期望需要的时间是多少?

题解

虽然总的排列情况有 $n!$ 种,但是每个人排在第 $i$ 个位置的概率均为 $\frac{1}{n}$,所以对每个人枚举 $n$ 个位置起跑到最前面需要的时间即可。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n; double v, u; cin >> n >> v >> u;
    double c[n] = {};
    for (int i = 0; i < n; i++)
        cin >> c[i];
    double d[n] = {};
    for (int i = 0; i < n; i++)
        cin >> d[i];
    double ans = 0.0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            ans += n * u / (c[i] - j * d[i] - v);     
    printf("%.3f\n", ans / n);
}

 

posted @ 2020-05-30 20:50  Kanoon  阅读(176)  评论(0)    收藏  举报