Alice和Bob赌糖果

Alice和Bob赌糖果 【赌徒破产模型】
题目链接:Alice和Bob赌糖果

在这里插入图片描述

解题思路

Alice起始位置在坐标轴的 n n n点,他往右走一格的概率是 p p p,往左走一格的概率是 1 − p 1 − p 1p,题目要求的则是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=(1p)fi1+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(1p)ki1p
所以有 f n = ∏ i = n n + m − 1 K i f_n=\prod^{n+m-1}_{i=n}K_i fn=i=nn+m1Ki

代码


#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;
}

  • 26
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值