Alice和Bob賭糖果【賭徒破產模型】
阿新 • • 發佈:2020-09-12
題意
\(\text{Alice}\) 從 \([l, r]\) 中隨機抽一個數,\(\text{Bob}\) 從 \([L, R]\) 中隨機抽一個數,誰抽的數大誰就贏,輸的一方給另一方\(1\) 顆糖(平局不用給糖),他們會一直賭下去直到有一方沒有糖果為止。 \(\text{Alice}\) 有 \(n\) 顆糖果,\(\text{Bob}\) 有 \(m\) 顆糖果,求 \(\text{Alice}\) 將 \(\text{Bob}\) 的糖果贏完的概率。
\(0\leq n,m \leq 1e5,n+m > 0,1 \leq l \leq r \leq 100,1\leq L \leq R\leq 100\)
連結:https://ac.nowcoder.com/acm/problem/14962
分析
\(f_i\) 表示 \(\text{Alice}\) 能從 \(i\) 顆糖果贏到 \(n+m\) 顆的概率,\(f_0=0\) 表示一開始就輸了,\(f_{n+m}=1\) 表示勝利,要求的答案為 :\(f_n\)。\(p\) 為 \(\text{Alice}\) 每次贏的概率,\(q\) 為每次輸的概率。
按照題目的條件,每次取整數,迴圈兩個區間暴力即可求出 \(p,q\)。
有:
\[f_i=p*f_{i+1}+q*f_{i-1}+(1-p-q)*f_{i} \]設 \(f_{i-1}=k_{i-1}*f_i\)
並且,\(k_0=0\)。
最終結果從 \(f_{n+m}=1\) 倒推,根據 \(f_{i-1}=k_{i-1}*f_i\),即可求出 \(f_n\)。
特判:
當 \(p=0\ 且\ p=0\) 時,計算 \(k_i\) 時,分母可能為 \(0\)。可以證明,當其中一個不為 \(0\) 時,分母不可能為 \(0\)。
程式碼
#include <bits/stdc++.h> using namespace std; const int N=2e5+5; double k[N]; int main() { int n,m,l,r,L,R; scanf("%d%d%d",&n,&l,&r); scanf("%d%d%d",&m,&L,&R); int a=0,b=0,c=0; for(int i=l;i<=r;i++) { for(int j=L;j<=R;j++) { a+=(i>j?1:0); b+=(i<j?1:0); c++; } } double p=1.0*a/c,q=1.0*b/c,ans=1.0; if(p==0&&q==0) ans=0; else { k[0]=0; for(int i=1;i<m+n;i++) k[i]=p/(p+q-q*k[i-1]); for(int i=n+m-1;i>=n;i--)//f[n+m]=1 ans*=k[i]; } printf("%.5f\n",ans); return 0; }