zoukankan      html  css  js  c++  java
  • 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
    ",p/(1-q));
        }
    }
    View Code
  • 相关阅读:
    Linux磁盘文件的命名
    操作系统的基本介绍
    CMOS、BIOS
    CPU的频率、外频、倍频与超频
    学习Linux——计算机概论
    第三季-第14课-有名管道通讯编程
    第三季-第13课-无名管道通讯编程
    第三季-第12课-多进程程序设计
    第三季-第11课-进程控制理论
    第三季-第10课-时间编程
  • 原文地址:https://www.cnblogs.com/lienus/p/4263535.html
Copyright © 2011-2022 走看看