zoukankan      html  css  js  c++  java
  • D. Bag of mice

    题目链接:https://codeforces.com/problemset/problem/148/D

    题意:一个袋子里有n只白老鼠和m只黑老鼠,公主和龙依次去摸老鼠,先摸到白老鼠的人获胜,由于龙很粗暴,每次摸老鼠时都会有一只老鼠跳出来,而在公主摸老鼠时不会,每只老鼠被摸到和跳出来的概率一样。如果最后都没有摸到白老鼠,则龙获胜。求公主获胜的概率。

    思路:概率dp,先找临界值,如果当袋子中只剩白老鼠了,那此时公主获胜的概率为1。当袋中没有老鼠或只剩黑老鼠时,那公主获胜的概率为0。然后在考虑dp转移(只需要考虑公主可能赢的情况):1.公主抓到一只白鼠,公主赢了。概率为 i/(i+j)

           2.公主抓到一只黑鼠,龙抓到一只黑鼠,跑出来一只黑鼠,概率为:j/(i+j) * (j-1)/(i+j-1) * (j-2)/(i+j-2)。

             3.公主抓到一只黑鼠,龙抓到一只黑鼠,跑出来一只白鼠,概率为:j/(i+j) * (j-1)/(i+j-1) * i/(i+j-2)。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    double dp[1005][1005];
    int main()
    {
        ll n,m;
        cin>>n>>m;
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
            dp[i][0]=1;
        for(int i=0;i<=m;i++)
            dp[0][i]=0;
        for(ll i=1;i<=n;i++)
            for(ll j=1;j<=m;j++)
        {
            dp[i][j]+=(double)i/(i+j);
            if(j>=3)
                dp[i][j]+=(double)(j*(j-1)*(j-2))/((i+j)*(i+j-1)*(i+j-2)) * dp[i][j-3];
            if(j>=2&&i>=1)
                dp[i][j]+=(double)(j*(j-1)*i)/((i+j)*(i+j-1)*(i+j-2)) * dp[i-1][j-2];
        }
        printf("%.9lf
    ",dp[n][m]);
    }
  • 相关阅读:
    进制
    流程控制
    运算符
    格式化输出
    数据结构-树的遍历
    A1004 Counting Leaves (30分)
    A1106 Lowest Price in Supply Chain (25分)
    A1094 The Largest Generation (25分)
    A1090 Highest Price in Supply Chain (25分)
    A1079 Total Sales of Supply Chain (25分)
  • 原文地址:https://www.cnblogs.com/zcb123456789/p/13719235.html
Copyright © 2011-2022 走看看