HDU-#1204 糖果大战(Markov过程+概率论)

来源:互联网 发布:java treeset 排序 编辑:程序博客网 时间:2024/04/27 20:09

         题目大意:给出两个人手上的糖果数以及玩游戏的胜的概率,问Speakless赢走全部糖果的概率为多少?

         解题思路:该题是一个概率论的问题,学过随机过程的知道这是一个马尔可夫过程,即其条件概率仅仅与系统的当前状态相关,与它的过去或者将来的形态无关。具体的讲解和分析可以查阅下马尔科夫的相关知识。而本题与马尔可夫过程中一个经典例子非常类似,就是赌徒输光问题。问题的描述和该题的性质大同小异,就不再赘述了,与本题相关的就是他的概率方程。分析本题可知:首先对特殊条件进行判断,若m=0,则Gardon糖果数为0,那么Speakless胜。反之,若n=0或者Speakless胜的概率为0或Gardon胜的概率为1,则Speakless都会输。然后除去特殊情况,看一般情况下,由两者概率可知:Gardon胜的概率为q*(1-p),Speakless胜的概率为p*(1-q)。如果两者的胜率相等时,即p==q,则Speakless胜的概率为n/(n+m)。若不相等时,运用赌徒输光的概率可知:Speakless胜的概率为(1-r^n)/(1-r^(n+m))。马尔可夫过程参见马儿可夫过程,赌徒输光问题赌徒输光。解法详见code。

         题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1204

        code:

#include <iostream>#include <cstdio>#include <cmath>using namespace std;const double INF = 1e-12;int n,m;double p,q,ans,r;int main(){    while(scanf("%d%d%lf%lf",&n,&m,&p,&q)!=EOF){        if(m==0) printf("1.00\n");//若m=0,则Speakless胜        else if(n==0 || p==0 || q==1) printf("0.00\n"); //若n=0或者Speakless胜的概率为0或Gardon胜的概率为1,则Speakless都会输        else{             r=q*(1-p)/(p*(1-q));//Gardon胜的概率为q*(1-p),Speakless胜的概率为p*(1-q)            if(fabs(r-1.0)<INF) ans=n*1.0/(n+m);//胜率相等时,即p==q,概率为n/(n+m)            else ans=(1-pow(r,n))/(1-pow(r,(n+m)));//不相等,则Speakless胜的概率为(1-r^n)/(1-r^(n+m))            printf("%.2lf\n",ans);        }    }    return 0;}

0 0