LightOJ 1027 A Dangerous Maze 基础概率DP

A Dangerous Maze LightOJ - 1027

nn 个门,每个门被选中的概率相等,有些门可以在 xix_i 时间后带你出去,而另外一些门在 xix_i 时间后带你重新回到原点。

问出去的期望时间。

设出去的期望时间为 EEn1,n2n_1,n_2 分别表示可以出去门的个数与不可出去的门的个数,用集合 M\mathcal{M} 来表示可以出去的门,U\mathcal{U} 为所有门的集合,M=n1,nn1=n2|\mathcal{M}|=n_1,n-n_1=n_2 那么:

E=1niMxi+1n[iM(xi+E)]E=1niMxi+1niMxi+n2nEn1nE=1niUxiE=1n1iUxi \begin{aligned} E&=\frac{1}{n}\sum_{i\in\mathcal{M}} x_i+\frac{1}{n}[\sum_{i\notin\mathcal{M}}(x_i+E)]\\ E&=\frac{1}{n}\sum_{i\in\mathcal{M}}x_i+\frac{1}{n}\sum_{i\notin\mathcal{M}}x_i+\frac{n_2}{n}E\\ \frac{n_1}{n}E&=\frac{1}{n}\sum_{i\in \mathcal{U}}x_i\\ E&=\frac{1}{n_1}\sum_{i\in\mathcal{U}}x_i \end{aligned}

代码如下:

#include<iostream>
#include<cstdio>
//#define WINE
using namespace std;
int T,iCase,n1,tot,d,a,n;
int gcd(int a,int b){
    if(b==0)return a;
    return gcd(b,a%b);
}
int main(){
#ifdef WINE
    freopen("data.in","r",stdin);
#endif
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        n1=tot=0;
        for(int i=1;i<=n;i++){
            scanf("%d",&a);
            if(a>0)n1++,tot+=a;
            else tot+=-a;
        }
        if(tot>n1)d=gcd(tot,n1);
        else d=gcd(n1,tot);
        if(n1==0)printf("Case %d: inf\n",++iCase);
        else printf("Case %d: %d/%d\n",++iCase,tot/d,n1/d);
    }
    return 0;
}

在这里插入图片描述

posted @ 2020-03-24 18:39  winechord  阅读(74)  评论(0编辑  收藏  举报