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

本文针对一个涉及概率论的编程问题,通过马尔可夫过程解析博弈中获胜的概率。特别是当两个玩家拥有不同数量的糖果,并根据不同的胜算进行游戏时,详细介绍了如何计算一方赢得所有糖果的概率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         题目大意:给出两个人手上的糖果数以及玩游戏的胜的概率,问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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值