【组队赛#8】BNU 1084 Expected Allowance (母函数)

题目链接click here~~

题目大意】给出一个n个骰子,每个骰子有m个面,给出一个削减值k,投掷一次,所有的骰子点数和要减去k,如果减去的值小于1,则得到的钱也至少是1;要求出他能得到钱的期望值

解题思路】母函数!!,关键在于理解题意思路:(每个点数出现的概率要计算) 具体看代码吧

母函数:

#include <bits/stdc++.h>
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>
using namespace std;
double c1[100005],c2[100005];
int main()
{
    int i,j,k,n,m,p;
    double sum;
    while(cin>>n>>m>>p)
    {
        if(n==0&&m==0&&p==0) break;
        sum=0;
        for(i=1; i<=m; i++){//初始化
            c1[i]=1;        //系数为1
            c2[i]=0;
        }
        for(i=1; i<n; i++){
            for(j=1; j<=m*i; j++)//第i个骰子投掷出m面的可能数
                for(k=1; k<=m; k++){//总共m面
                    c2[j+k]+=c1[j];
                }
            memcpy(c1,c2,sizeof(c2));
            memset(c2,0,sizeof(c2));
        }
//        for(int i=1;i<=m;i++)
//        {
//            cout<<c1[i]<<" "<<c2[i]<<endl;
//        }
        for(int i=n; i<=n*m; i++){//n个骰子,每个m面,最小点数为n,最大点数为n*m
            if(i>p)
                sum+=c1[i]*(double)(i-p);
            else
                sum+=c1[i];
        }
//          cout<<"#"<<sum<<"#"<<endl;
        printf("%.8lf\n",sum/pow(m,n));
    }
    return 0;
}

当时比赛最后十几分钟,突然想到一个递推的思路,大致思路是这样:每次从1到m面搜一遍,找出出现1到n*m面的所有可能数,当以骰子个数为0 时结束,且每次计算ans的值

dfs:

#include <bits/stdc++.h>
using namespace std;
double pow(double n,double m)
{
    double res=1;
    for(int i=1; i<=n; i++)
        res*=(m);
    return res;
}
double  ans;
double n,m,k;
double sum;
void dfs(int a,int b)
{
    if(a==0)
    {
        ans+=(b-k<1?1:(b-k));
        return;
    }
    for(int i=1;i<=m;i++)
    {
        dfs(a-1,b+i);
    }
}
int main()
{
    while(cin>>n>>m>>k)
    {
        ans=0;
        if(n==0&&m==0&&k==0) break;
        dfs(n,0);
        //printf("%lf\n",ans);
        double ans2=pow(n,m);
        double result=(ans/ans2);
        printf("%.8lf\n",result);
    }
    return 0;
}
时间: 2024-10-12 20:37:26

【组队赛#8】BNU 1084 Expected Allowance (母函数)的相关文章

BNU 1084 Expected Allowance (dp||母函数||深搜)

题目链接:http://www.bnuoj.com/v3/problem_show.php?pid=1084 题目大意:给你n个骰子,每个骰子有m个面,点数分别为(1-m),现在同时摇这n个骰子,(得到的点数和)-k  即为小明得到的钱数,当然小明每次最少会得到一元(即最后结果小于等于1时),问小明得到钱数的期望值. 解题思路:由于此题m*n较小,故按照普通的期望计算就行,即   摇到某个点数(i)的概率p*摇到的点数(i),其中显然(n=<  i  <=n*m)除以总的情况数(m的n次方)(

【组队赛#5】BNU 4291 Arbitrage? (floyd最短路 map映射)

[题目链接]click here~~ [题目大意]去多个国家旅游,给定国与国之间汇率的转化率,如果从起点出发最后回到起点,有收益则符合,否则不符合 [解题思路] 判一次环,用floyd计算距离最短的而且转换率最大的,map<string ,int >映射  <字符串--点> 代码 /* BNUOJ 4291 Arbitrage? Author :HRW 判一次环,用floyd计算距离最短的而且转换率最大的 map<string ,int >映射 <字符串--点&g

【组队赛#5】BNU 4299 God Save the i-th Queen (数组映射)

[题目链接]click here~~ [题目大意]给你一个N*M的棋盘,并且给定T个已经固定位置的皇后(横坐标,纵坐标已知),求下一个合法放置皇后的可能数 [解题思路] 因为只是求下一个皇后的位置,而不是求所有其他可能,因此可以按照如下思路进行:  对n*n的矩阵进行映射,将其转换为1*(n+m)的单行模式. 1.行列可以直接映射. 2.对于对角线有两种情况(画图验证) 1.1.映射为x+y模式(一三区间) 2..1映射为x-y+Y模式(二四区间)  (注意!前面的x是映射的行,Y后才是列) 代

【组队赛#7】BNU 4275 Your Ways(数学题 + 动态规划)

[题目链接]:click here~~ [题目大意]:题意:给出一个w*h的方格,问除去不能走的路,从(0,0)到(w,h)共有多少种走法. [解题思路]:第七场比赛的题,最后一小时在看这道题,比较遗憾最后还是没有A出来,赛后重新看了看题目,理清一下思路,发现就是道简单的dp, 处理一下除去不能走的路,不过要注意题目的一句话:" The blocking is done in such a way that it isnot possible to reach parts of the stre

bnu 34985 Elegant String(矩阵快速幂+dp推导公式)

Elegant String Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main Prev Submit Status Statistics Discuss Next Type: None None Graph Theory      2-SAT     Articulation/Bridge/Biconnected Component      Cy

HDU 2189 悼念512汶川大地震遇难同胞——来生一起走(母函数或完全背包)

悼念512汶川大地震遇难同胞--来生一起走 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3773    Accepted Submission(s): 1913 Problem Description 妈妈你别哭泪光照亮不了我们的路让我们自己慢慢的走 妈妈我会记住你和爸爸的模样记住我们的约定来生一起走 上面这首诗节选自一位诗人纪念遇难

BZOJ 1084 最大子矩阵 终于过了

一开始看到这道题,由于觉得m <= 2, 所以觉得这是道水题,回去后想了一下.在晚上来机房的时候已经想出来了,但是我必须承认细节决定成败.远在一个小时前我就已经把算法的主体都写好了,但是就是一直WA,为什么就是各种粗心,真心想捏死自己.一个小时就这么白白浪费了.我希望明天的我能变得强大一点.在有了今日惨痛的教训之后. 这道题并不难.用d[i][j][k] 来表示状态.i表示第几行,j表示之前取了多少个矩阵,k表示上一行的状态.即上一行的矩阵取法.如果k == 0 那么没有一个矩阵延伸到上一行,如

webpack 打包压缩 ES6文件报错UglifyJs + Unexpected token punc &#171;(&#187;, expected punc &#171;:&#187;

webpack打包压缩 ES6 js..vue报错: ERROR in js/test.js from UglifyJs Unexpected token punc ?(?, expected punc ?:? [js/test.js:1374,5] 解决方案: 配置babel,把配置放到文件[.babelrc]中 { "presets": ["es2015"] }

HDU 2065 红色病毒 指数型母函数+泰勒公式

医学界发现的新病毒因其蔓延速度和Internet上传播的"红色病毒"不相上下,被称为"红色病毒",经研究发现,该病毒及其变种的DNA的一条单链中,胞嘧啶,腺嘧啶均是成对出现的. 现在有一长度为N的字符串,满足一下条件: (1) 字符串仅由A,B,C,D四个字母组成; (2) A出现偶数次(也可以不出现); (3) C出现偶数次(也可以不出现); 计算满足条件的字符串个数. 当N=2时,所有满足条件的字符串有如下6个:BB,BD,DB,DD,AA,CC. 由于这个数据