hdu_1204 糖果大战 (概率论)

这篇博客探讨了HDU_1204糖果大战问题的解决方案,通过特殊情况分析和建立Markov Chain模型来计算赢得游戏的概率。博主推导出递推公式,并利用等比数列求和公式得出最终的概率表达式。

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

http://acm.hdu.edu.cn/showproblem.php?pid=1204

分析:

1) 特殊情况(注意顺序)

    n=0                                           lose

    m=0(此时已排除 n=0 情况)  win

    p=0&&q==1                            lose

    p=1&&q=0                               win

    p=q                                          n/(n+m)

2) 一般情况(markov  chain model)

    f(i)  : Speakless已经得第i个糖果的概率;

    win:p(1-q)——> f(i+1);

    lose:q(1-p)——> f(i-1);

    平局:1-p(1-q)-q(1-p) —— f(i);

 f(i) = p(1-q)*f(i+1) + q(1-p)*f(i-1) + (1-p(1-q)-q(1-p))*f(i)

化为: p(1-q) * (f(i+1)-f(i)) = q(1-p) * (f(i)-f(i-1))

令 g(i)=f(i)-f(i-1) , t = g(i+1) / g(i) =  ( q(1-p) ) / ( p(1-q) )  (等比数列公比)

递推式: g(i) = g(i-1)* t 

g(1) = f(1)-f(0)
g(2) = f(2)-f(1)
...
g(n) = f(n)-f(n-1)
...
g(n+m) = f(n+m)-f(n+m-1)

将上面的各式相加:g(1)+g(2)+...+g(n+m) = f(n+m)-f(0)=1

因为:  f(0)=0 ,f(n+m)=1

所以 : g(1)+g(2)+...+g(n) = f(1)*(1-t^(n))/(1-t)=f(n)                            (1)
              g(1)+g(2)+...+g(n+m) = f(1)*(1-t^(n+m))/(1-t)=1                     (2)


(1)/(2)得 :f(n) = (1-t^n) / (1-t^(m+n))

   

代码:

#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;

int main()
{
    int n,m;
    double p,q;
    double t,ans;
    while(scanf("%d%d%lf%lf",&n,&m,&p,&q)!=EOF){
        if(n==0)     {printf("0.00\n"); continue;}
        if(m==0)     {printf("1.00\n");continue;}
        if(p==0 || q==1) {printf("0.00\n");continue;}
        if(q==0 || p==1) {printf("1.00\n");continue;}
        if(p==q)         ans= 1.0*n/(m+n);
        else{
            t=q*(1-p) / (p*(1-q));
            ans= (1.0-pow(t,n)) / (1.0 -pow(t,n+m));
        }
        printf("%.2f\n",ans);
    }
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值