Alice和Bob赌糖果【赌徒破产模型】
题意
\(\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_i=\frac{p}{p+q-q*k_{i-1}}\ \ \ \ 1\leq i \leq n+m-1
\]
并且,\(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;
}

浙公网安备 33010602011771号