題目連接
題意:
求數學期望:
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;
}