Alice和Bob赌糖果 【赌徒破产模型】
题目链接:Alice和Bob赌糖果
解题思路
Alice起始位置在坐标轴的 n n n点,他往右走一格的概率是 p p p,往左走一格的概率是 1 − p 1 − p 1−p,题目要求的则是Alice走到 n + m n + m n+m处的概率。
设当Alice有
i
i
i颗糖果时,其将Bob的糖果赢完的概率设为
f
i
f_i
fi
有:
f
0
,
f
n
+
m
=
1
f_0,f_{n+m}=1
f0,fn+m=1
f
i
=
(
1
−
p
)
f
i
−
1
+
p
f
i
+
1
f_i=(1-p)f_{i-1}+pf_{i+1}
fi=(1−p)fi−1+pfi+1
令
f
i
=
k
i
f
i
+
1
f_i=k_if_{i+1}
fi=kifi+1
有:
k
i
=
p
1
−
(
1
−
p
)
k
i
−
1
k_i=\frac{p}{1-(1-p)k_{i-1}}
ki=1−(1−p)ki−1p
所以有
f
n
=
∏
i
=
n
n
+
m
−
1
K
i
f_n=\prod^{n+m-1}_{i=n}K_i
fn=∏i=nn+m−1Ki
代码
#include <iostream>
using namespace std;
double cal(int a, int b, double p){
double ans = 1.0, k = 0.0;
for(int i = 1; i < b; i++){
k = p / (1 - (1 - p) * k) ;
if(i >= a) ans *= k;
}
return ans;
}
void solves()
{
int n, l, r, m, L, R;
cin>>n>>l>>r>>m>>L>>R;
if(!n){
printf("0.00000");
return ;
}
int t1 = 0, t2 = 0;
for(int i = l; i <= r; i++)
for(int j = L; j <= R; j++){
if(i > j) t1++;//Alice赢的次数
else if(i < j) t2++;//Bob赢的次数
}
double p = t1 * 1.0 / double(t1 + t2);
double ans = cal(n, n+m, p);//Alice从开始的n个糖果数到赢得所有n+m的糖果数的概率
printf("%.5f\n",ans);
return ;
}
signed main()
{
int T=1;
while(T--){
solves();
}
return 0;
}