题目连接
题意:
求数学期望:
n个人 两两相聚 u米, 每个人正常速度为v m/s
当某个配送员排在最后的时候, 他需要以当时自己的最高速度往前跑.
直到超过排头的人 u 米, 然后降回到初始速度,
每人最初的最高速度为c[i] m/s 每轮衰减d[i] m /s
n个人初始以随机的顺序排列,每种顺序的概率完全相等,
跑完一轮(每个人都追到排头一次,序列恢复原样)的期望需要的时间是多少?
数据范围:
n <= 1000 v <= 100 u <= 10
输入数据保证每个人的速度不会衰减到<=v
思路
1)如果i是第j个跑的,那么他从最后开始追的最高速度就是c[i] - (j-1) * d[i] 米/秒。
2)每个人每个位置都要经历一遍,每一遍实际上都是要用相对速度 (c[i] - v - (j - 1) * d[i]) (因为其他人的速度都是v) 跑 n * u 米
3)这样我们就可以求出每个人再不同位置跑到最前面的平均时间
time[ i ] = n*u / (c[i] - v - (j - 1) * d[i])
time[ i ] /= n
4)一轮的总时间等于所有跑完一次的时间和,最后求跑完一轮的时间期望 E(n) = time[i].
AC:
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e3 + 10;
int main() {
int n;
double u, v, c[MAXN], d[MAXN];
scanf("%d%lf%lf", &n, &v, &u);
for (int i = 1; i <= n; ++i) {
scanf("%lf", &c[i]);
}
for (int i = 1; i <= n; ++i) {
scanf("%lf", &d[i]);
}
double time = 0;
for (int i = 1; i <= n; ++i) {
//每个人每个位置都要经历一遍,每一遍实际上都是要用相对速度 (c[i] - v - (j - 1) * d[i]) 跑 n * u 米
//这样就求出每个人在不同位置出发跑到最前面所用时间的总和,最后除以n 就是每个人从不同位置出发的平均时间,
// 求跑完一轮的时间期望 把所有人的平均时间+起来
for (int j = 1; j <= n; ++j) { //i是第j个跑的,那么他的最大速度就是c[i]-(j-1)d[i] 米/秒
time += u * n / (c[i] - v - (j - 1) * d[i]);
}
}
printf("%.3f\n", time/n);
return 0;
}