身體訓練 (牛客算法週週練1)期望

題目連接

    題意:
        求數學期望:
        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 / \sum_{i = 1}^{n} (c[i] - v - (j - 1) * d[i])

              time[ i ] /= n

        4)一輪的總時間等於所有跑完一次的時間和,最後求跑完一輪的時間期望 E(n) =  \sum_{i = 1}^{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;
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章