Alice和Bob赌糖果

题目:
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+qfi1+(1pq)fi=pfi+1+qfi1(1)
f i − 1 = k i − 1 f i f_{i-1}=k_{i-1}f_i fi1=ki1fi,代入 ( 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+qqki1p1in+m1
然后和赌徒破产一样,或者按照 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+qqki1=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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值