• hdu5194 DZY Loves Balls 【概率论 or 搜索】


    //yy:那天考完概率论,上网无聊搜个期望可加性就搜到这题,看到以后特别有亲和感,挺有意思的。

    hdu5194 DZY Loves Balls 【概率论 or 搜索】

    题意:

    一个盒子里有n个黑球和m个白球【n,m≤12】。每次随机从盒子里取走一个球,取了n+m次后,刚好取完。现在用一种方法生成了一个随机的01串S[1…(n+m)],如果第i次取出的球是黑色的,那么S[i]=1,如果是白色的,那么S[i]=0。求'01'在S串中出现的期望次数。

    题解:

    求出在第i个位置上出现0,第i+1个位置上出现1的概率,这种情况设为Xi = 1,这就是二项分布啦,

    根据期望的可加性,有E∑Xi = N * P。(期望的可加性不要求事件相互独立喔,方差要求JT1ZTDTB{65D{_Z~NMP[N)V所以可以这样做吖)

    Xi = 1的概率 P = m / (n + m)  *  n / (n + m - 1)

    由题意可知这里的 N = (n + m - 1)

    化简一下答案就出来了: n * m / (n + m)

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    int gcd(int a, int b) {return b ? gcd(b, a%b) : a;}
    int main() {
        int m, n, x;
        while(~scanf("%d%d", &m, &n)) {
            x = gcd(m*n, m+n);
            printf("%d/%d
    ", m*n/x, (m+n)/x);
        }
        return 0;
    }

     还有个搜索方法,房教写的,膜拜ORZ

    get一个快遗忘的知识点,用常引用减小开栈的开销。。。如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    long long dp[13][13];
    long long C[25][25];
    long long ans = 0;
    ll dfs(const int& x,const int& y,const int& st)
    {
        if(st==1&&dp[x][y]!=-1) return dp[x][y];
        long long ans = 0;
        if(st==0){
            if(x>0){
                ans += C[x+y-1][y] + dfs(x-1,y,1);
            }
            if(y>0)
            {
                ans += dfs(x,y-1,0);
            }
        }
        if(st==1){
            if(x>0){
                ans += dfs(x-1,y,1);
            }
            if(y>0)
            {
                ans += dfs(x,y-1,0);
            }
        }
        if(st==1)dp[x][y] = ans;
        return ans;
    }
    void get_C(int maxn)
    {
        C[0][0] = 1;
        for(int i=1;i<=maxn;i++)
        {
            C[i][0] = 1;
            for(int j=1;j<=i;j++)
                C[i][j] = C[i-1][j]+C[i-1][j-1];
            //C[i][j] = (C[i-1][j]+C[i-1][j-1])%MOD;
        }
    }
    int main(){
        memset(dp,-1,sizeof(dp));
        dp[0][0] = 0;
        get_C(24);
        int n,m;
        while(scanf("%d%d",&n,&m)==2)
        {
            ll b=C[n+m][n];
            ll sum=dfs(n,m,1);
            ll a=__gcd(sum,b);
            printf("%lld/%lld
    ",sum/a,b/a);
        }
        return 0;
    }
  • 相关阅读:
    系统权限控制模型
    [Golang] 剑走偏锋 -- IoComplete ports
    Golang 正则匹配 -- regexp
    golang -- 字符串就地取反
    Hyperledger Fabric chaincode 开发(疑难解答)
    could not launch process: decoding dwarf section info at offset 0x0: too short
    win10 Ubuntu16 双系统
    7-8 哈利·波特的考试
    7-7 六度空间
    7-6 列出连通集
  • 原文地址:https://www.cnblogs.com/GraceSkyer/p/7107224.html
Copyright © 2020-2023  润新知