HDU3232 Crossing Rivers(简单数学期望)

来源:互联网 发布:淘宝店铺投诉管用吗 编辑:程序博客网 时间:2024/04/30 02:15

题意:A B之间距离为D,一共有n条河流,p是从A地到河岸的距离,L是河流长度,v是船速,人步行的速度总是1。求从A到B所用时间的数学期望。

分析:主要是求船将人从东岸运送到西岸所用时间的期望。每条河流长L,一开始船任意分布在河中共有L种可能,而任意位置船可能正在向西走也可能向东走,这样总共是2*L种情况。设初始船离东岸位置为x,则若船此时向西走,所用时间期望为( 1/2*l ) * ( x + l )  /  v ,若此时向东走,所用时间期望为( 1/2*l ) * ( x - l + l + l )  /  v即( 1/2*l ) * ( 3 * l - x )  /  v,所以每一个点的期望就是向东走的期望加上向西走的期望一共是2 / v,这是每个点的期望,每条河的河长为 l,故每条河的期望是( 2 * l ) / v 。求完渡河的时间期望再加上步行所用的时间即可。

#include<iostream>#include<queue>#include<algorithm>#include<cstdio>#include<cmath>#include<cstring>#include<map>#define Mod 100000000typedef __int64 ll;using namespace std;const int MAXN = 10 + 10;const int MAXT = 10000 + 10;const int INF = 0x7f7f7f7f;int p[MAXN];int L[MAXN];int v[MAXN];int main(){    int n, D;    int cnt = 0;    while(scanf("%d%d", &n, &D) == 2)    {        memset(p, 0, sizeof p);        memset(L, 0, sizeof L);        memset(v, 0, sizeof v);        if(n == 0 && D == 0)            return 0;        double sum = 0.0;        for(int i = 0; i < n; ++i)        {             scanf("%d%d%d", &p[i], &L[i], &v[i]);             sum += double(L[i]);        }        double ans = double(D) - sum;        for(int i = 0; i < n; ++i)            ans += 2 * double(L[i]) / v[i];        printf("Case %d: %.3lf\n\n", ++cnt, ans);    }    return 0;}


0 0
原创粉丝点击