身体训练 (牛客算法周周练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;
} 

 

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