题目:
https://ac.nowcoder.com/acm/problem/14962
Alice和Bob赌糖果。规则是这样的:Alice从 [ l , r ] [ l, r] [l,r]中随机抽一个数,Bob从 [ L , R ] [ L, R] [L,R]中随机抽一个数,谁抽的数大谁就赢,输的一方给另一方 1 1 1颗糖(平局不用给糖),他们会一直赌下去直到有一方没有糖果为止。Alice有 n n n颗糖果,Bob有 m m m颗糖果,求Alice将Bob的糖果赢完的概率。
思路:
令
f
i
f_i
fi表示Alice能从
i
i
i元赢到
n
+
m
n+m
n+m元的概率,
f
0
=
0
f_0=0
f0=0(已经输了),
f
n
+
m
=
1
f_{n+m}=1
fn+m=1(已经赢了),答案为
f
n
f_n
fn。
p
p
p为Alice每次赢的概率,
q
q
q为输的概率。
f
i
=
p
f
i
+
1
+
q
f
i
−
1
+
(
1
−
p
−
q
)
f
i
(
p
+
q
)
f
i
=
p
f
i
+
1
+
q
f
i
−
1
(
1
)
\begin{aligned} f_i&=pf_{i+1}+qf_{i-1}+(1-p-q)f_i\\ (p+q)f_i&=pf_{i+1}+qf_{i-1}\quad (1)\\ \end{aligned}
fi(p+q)fi=pfi+1+qfi−1+(1−p−q)fi=pfi+1+qfi−1(1)
设
f
i
−
1
=
k
i
−
1
f
i
f_{i-1}=k_{i-1}f_i
fi−1=ki−1fi,代入
(
1
)
(1)
(1)得
k
i
=
p
p
+
q
−
q
k
i
−
1
1
≤
i
≤
n
+
m
−
1
k_i=\frac{p}{p+q-qk_{i-1}}\quad 1\le i\le n+m-1\\
ki=p+q−qki−1p1≤i≤n+m−1
然后和赌徒破产一样,或者按照
p
p
+
q
,
q
p
+
q
\frac{p}{p+q},\frac{q}{p+q}
p+qp,p+qq计算。
注意: p = 0 , q = 0 p=0,q=0 p=0,q=0在计算 k [ i ] k[i] k[i]时分母为 0 0 0,要特判。可以证明如果 p ≠ 0 p\neq0 p=0或 q ≠ 0 q\neq0 q=0,则 p + q − q k i − 1 ≠ 0 p+q-qk_{i-1}\neq0 p+q−qki−1=0。
#include<bits/stdc++.h>
using namespace std;
const int N=200009;
int n,m,xx,yy,xxx,yyy,t1=0,t2=0,t3=0;
double p,q,k[N],ans=1.0;
int main()
{
scanf("%d%d%d%d%d%d",&n,&xx,&yy,&m,&xxx,&yyy);
for(int i=xx; i<=yy; i++)
for(int j=xxx; j<=yyy; j++)
{
t1+=(i>j?1:0);
t2+=(i<j?1:0);
t3++;
}
p=(double)t1/t3,q=(double)t2/t3;
if(!p&&!q)
printf("%.5f",0.0);//特判
else
{
k[0]=0;
for(int i=1; i<n+m; i++)
k[i]=p/(p+q-k[i-1]*q);
for(int i=n; i<n+m; i++)
ans*=k[i];
printf("%.5f",ans);
}
return 0;
}