HDU1024糖果大战(条件概率与全概率公式的应用)

传送门
推荐一个讲全概率公式的博客
条件概率:在事件 B B B已发生的条件下,事件 A A A发生的概率
记为 P ( A ∣ B ) P(A|B) P(AB)
全概率公式: P ( A ) = ∑ i = 1 n P ( B i ) ⋅ P ( A ∣ B i ) P(A)=\sum\limits_{i=1}^{n}P(B_i)\cdot P(A|B_i) P(A)=i=1nP(Bi)P(ABi)
使用条件是 B i B_i Bi互斥且 B i B_i Bi B i B_i Bi构成全集,即 ∑ i = 1 n P ( B i ) = 1 \sum\limits_{i=1}^{n}P(B_i)=1 i=1nP(Bi)=1
题意:两人初始分别有N,M颗糖果,如果谁赢一局,就拿走对方一颗糖,直到拿完对方所有的糖为止。Speakless单局赢的概率为 p p p,令一个单 局赢的概率为 q q q,如果是平局,不会有任何糖果的得失。问最终Speakless赢的概率是多少。
本题题解
定义 u j u_j uj为Speakless初始拥有 j j j颗糖果并最终取胜的概率
则答案为 u N u_N uN
记事件 P ( A ) = u j P(A)=u_j P(A)=uj
则事件 B 1 B_1 B1为Speakless单局取胜, B 2 B_2 B2为Speakless当局失败, B 3 B_3 B3为平局。则在 B 1 B_1 B1已发生的条件下 A A A发生就相当于初始Speakless有 j + 1 j+1 j+1个糖果并最终取胜,即 P ( A ∣ B 1 ) = u j + 1 P(A|B_1)=u_{j+1} P(AB1)=uj+1,同理 P ( A ∣ B 2 ) = u j − 1 , P ( A ∣ B 3 ) = u j P(A|B_2)=u_{j-1}, P(A|B_3)=u_j P(AB2)=uj1P(AB3)=uj;
则有全概率公式为 P ( A ) = P ( B 1 ) u j + 1 + P ( B 2 ) u j − 1 + P ( B 3 ) u j P(A)=P(B_1)u_{j+1}+P(B_2)u_{j-1}+P(B_3)u_j P(A)=P(B1)uj+1+P(B2)uj1+P(B3)uj
显然 P ( B 1 ) = p ( 1 − q ) , 记 为 P , P ( B 2 ) = q ( 1 − p ) , 记 为 Q , P ( B 3 ) = 1 − P − Q P(B_1)=p(1-q),记为P,P(B_2)=q(1-p),记为Q,P(B_3)=1-P-Q P(B1)=p(1q),P,P(B2)=q(1p),Q,P(B3)=1PQ
整理一下有
u j + 1 − u j u j − u j − 1 = Q P \frac{u_{j+1}-u_j}{u_j-u_{j-1}}=\frac{Q}{P} ujuj1uj+1uj=PQ
g [ i ] = u i − u i − 1 g[i]=u_i-u_{i-1} g[i]=uiui1
g [ i ] g[i] g[i]为等比数列,比为 k = Q P k=\frac{Q}{P} k=PQ
所以 g [ 1 ] + g [ 2 ] + ⋯ + g [ N + M ] = g [ 1 ] ⋅ ( 1 − k N + M ) 1 − k g[1]+g[2] +\cdots +g[N+M]=\frac{g[1]\cdot(1-k^{N+M})}{1-k} g[1]+g[2]++g[N+M]=1kg[1](1kN+M)
g [ 1 ] + g [ 2 ] + ⋯ + g [ N + M ] = u 1 − u 0 + u 2 − u 1 + ⋯ + u N + M − u N + M − 1 = u N + M − u 0 g[1]+g[2]+\cdots+g[N+M]=u_1-u_0+u_2-u_1+\cdots+u_{N+M}-u_{N+M-1}=u_{N+M}-u_0 g[1]+g[2]++g[N+M]=u1u0+u2u1++uN+MuN+M1=uN+Mu0
显然 u 0 = 0 , u N + M = 1 u_0=0,u_{N+M}=1 u0=0,uN+M=1
两式一化求得 u 1 u_1 u1
g [ 1 ] + g [ 2 ] + g [ 3 ] + ⋯ + g [ N ] = u 1 − u 0 + ⋯ + u N − u N − 1 = u N = g [ 1 ] ⋅ ( 1 − k N ) 1 − k g[1]+g[2]+g[3]+\cdots+g[N]=u_1-u_0+\cdots+u_N-u_{N-1}=u_N=\frac{g[1]\cdot(1-k^{N})}{1-k} g[1]+g[2]+g[3]++g[N]=u1u0++uNuN1=uN=1kg[1](1kN)
g [ 1 ] g[1] g[1]带入有 u N = 1 − k N 1 − k N + M u_N=\frac{1-k^N}{1-k^{N+M}} uN=1kN+M1kN
到此差不多解决了
但是有一些特殊的要先处理一下
按优先级从大到小判断排序
N = 0 , 则 u N = 0 N=0,则u_N=0 N=0,uN=0
M = 0 , 则 u N = 1 M=0,则u_N=1 M=0uN=1
p = = 0 ∣ ∣ q = = 1 , 则 u N = 0 p==0||q==1,则u_N=0 p==0q==1,uN=0
q = = 0 ∣ ∣ p = = 1 , 则 u N = 1 q==0||p==1,则u_N=1 q==0p==1,uN=1
q = = p ( 这 个 也 需 要 特 判 , 不 然 会 出 现 除 零 ) , 则 u N = N / ( N + M ) q==p(这个也需要特判,不然会出现除零),则u_N=N/(N+M) q==p(uN=N/(N+M)
代码:

#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int MX=4e2+7;
const int mod=9901;
using namespace std;
int p[MX],k[MX];
ll qpow(ll a,ll b,ll MOD=mod){for(ll ans=1;;a=a*a%MOD,b>>=1){if(b&1)ans=ans*a%MOD;if(!b)return ans;}}
ll inv(ll a,ll MOD=mod){return qpow(a,MOD-2,MOD);}
ll __gcm(ll a,ll b){return a*b/__gcd(a,b);}
unordered_map<ll,int>mp;
int g[MX];
int main()
{
  ios::sync_with_stdio(0),cin.tie(0);
  double p,q,ans;
  ll N,M;
  while(cin>>N>>M>>p>>q)
  {
      if(N==0)
      {
          cout<<0.00<<endl;
      }

      else if(M==0)
      {
          cout<<1.00<<endl;
      }
      else if(p==0||q==1)
      {
          cout<<0.00<<endl;
      }
      else if(q==0||p==1)
      {
          cout<<1.00<<endl;
      }
      
      else if(p==q)
      {
          ans=1.0*N/(N+M);
          cout<<fixed<<setprecision(2)<<ans<<endl;
      }
      else {
        double k=q*(1-p)/(p*(1-q));
        double res=(1-pow(k,N))/(1-pow(k,N+M));
        cout<<fixed<<setprecision(2)<<res<<endl;
      }

  }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值