HDU 2909 - Expected Allowance

来源:互联网 发布:1024程序员节 编辑:程序博客网 时间:2024/05/16 19:36
        计算期望值的一道题,题目大意:给出一个n个骰子,每个骰子有m个面,给出一个削减值k,也就是所有的骰子点数得和要减去k,就是他能得到的钱,题目又给出:如果骰子的点数小于k,则得到的钱也至少是1;要求出他能得到钱的期望值;所有点数的概率是类似于一个二项式的,然后分别乘以其权值,然后除以m^n;就是所要求期望值

AC code:

#include<cstdio>
#include<cstring>
using namespace std;
int num[2][100000];
int main()
{
    int n,m,k;
    while(scanf(\"%d%d%d\",&n,&m,&k)!=EOF&&(n||m||k))
    {
        memset(num,0,sizeof(num));
        for(int i=1; i<=m; i++)
            num[1][i]=1;
        for(int i=2; i<=n; i++)
        {
            for(int j=1; j<=i*m; j++)
                for(int l=1; l<=m; l++)
                    num[i%2][j+l]+=num[(i-1)%2][j];
            memset(num[(i-1)%2],0,sizeof(num[(i-1)%2]));
        }
        double res=0.0;
        int i,j;
        for(i=1; i<=k+1; i++)
            res+=num[n%2][i];
        for(j=2;i<=n*m; i++,j++)
            res+=num[n%2][i]*j;
        int count=1;
        for(int i=1;i<=n;i++)
            count*=m;
        res/=count;
        printf(\"%.8lf\\n\",res);
    }
    return 0;
}
原创粉丝点击