hdu4586(概率、期望)

 

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4586

题意:有一个色子,n面,每面有个分值a[i],其中有m面比较特殊,当该面出现时,可以再投一次。求最后得分期望。

分析:设投掷第一次的期望是p,那么第二次的期望是m/n*p,第三次的期望是 (m/n)^2*p......第N次的期望是(m/n)^(N-1)*p。

设q = m/n,公比就是q,本题中等比数列之和为p*(1-q^N)/(1-q)。分三种情况讨论:

当p为0时,输出0.00;

当q等于1时,无论哪个面都可以再投一次,说明可以无限的投掷下去,输出inf;

当q < 1时,N无穷大时,1-q^N区域1,那么原式变为p/(1-q)。

注意:m个面当中可能重复。

#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>
#include <stack>
#include <vector>
#include <set>
#include <map>
#define LL long long
#define mod 100000000
#define inf 0x3f3f3f3f
#define eps 1e-6
#define N 1000010
#define FILL(a,b) (memset(a,b,sizeof(a)))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int vis[210];
int main()
{
    int n,m,x;
    while(scanf("%d",&n)>0)
    {
        double sum=0,cnt=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            sum+=x;
        }
        FILL(vis,0);
        scanf("%d",&m);
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&x);
            if(vis[x])continue;
            vis[x]=1;
            cnt++;
        }
        double p=sum/n;
        double q=cnt/n;
        if(fabs(p)<eps)puts("0.00");
        else if(fabs(1-q)<eps)puts("inf");
        else printf("%.2lf\n",p/(1-q));
    }
}
View Code

 

posted on 2015-01-31 01:11  lienus  阅读(127)  评论(0编辑  收藏  举报

导航