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

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

  }
}

发布了109 篇原创文章 · 获赞 35 · 访问量 6001

猜你喜欢

转载自blog.csdn.net/weixin_43965698/article/details/104301382
今日推荐