UVa11427 Expect the Expected

本文通过一个游戏胜率与期望天数的问题,深入探讨了概率论中的几何分布原理及其在实际问题解决中的应用。文章首先详细解释了如何通过概率动态规划的方法来计算在特定条件下的期望天数,进而引出了几何分布的概念,并通过实例说明了其在判断连续事件中首次成功的期望次数上的适用性。此外,文章还强调了在计算过程中避免使用浮点数的重要性,以及数学方法相较于递归计算在精确度上的优势。通过这一案例,读者不仅能够理解概率论中的关键概念,还能掌握解决实际问题时的有效策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        题意:你每天晚上玩游戏,第一把赢了就去睡觉,输了继续。你每一把赢的概率是p,当你赢的比例严格大于p时,才会去睡觉。但是你一个晚上最多玩n把游戏,如果哪天获胜比例一直没有大于p,你以后再也不玩了。求玩游戏天数的期望。

        思路:先求出一个晚上赢的比例一直没有超过p的概率P,方法是概率dp,一盘一盘向后推,超过比例则跳出。答案直接就是1/P。。为什么,回忆一下概率论学过的内容,这不就是几何分布吗。。做一件事(每次独立)成功概率是P,第一次做成时做的次数的期望就是1/P。还有一点要注意的,到底怎么判断赢的比例有没有超过p,我是从白书上学到的,方法见代码。

        做了这题收获还是不小的:

1.能避免使用浮点数的时候,就不要使用,毕竟容易丢失精度。

2.数学非常重要。能用数学方法算出的值往往比递推n次要精确,毕竟n不能达到极限。


#include <iostream>           
#include <stdio.h>           
#include <cmath>           
#include <algorithm>           
#include <iomanip>           
#include <cstdlib>           
#include <string>           
#include <string.h>           
#include <vector>           
#include <queue>           
#include <stack>           
#include <map>         
#include <assert.h>
#include <set>         
#include <ctype.h>                
#define ll long long       
#define max3(a,b,c) max(a,max(b,c))       

using namespace std; 

double dp[110][110];

int main(){
	int t;
	cin>>t;
	int cas=0;
	while(t--){
		cas++;
		int a,b;
		char c;
		double p;
		cin>>a>>c>>b;
		p=(double)a/b;
		int n;
		cin>>n;
		//init
		for(int i=0;i<=n;i++)
			for(int j=0;j<=n;j++)dp[i][j]=0.0;

		dp[1][0]=1.0-p;
		for(int i=2;i<=n;i++){
			for(int j=0;j<=n;j++){
				dp[i][j]+=dp[i-1][j]*(1.0-p);
				if((j+1)*b>a*i)break;
				dp[i][j+1]=dp[i-1][j]*p;
			}
		}
		
		double plose=0.0;
		for(int i=0;i<=n;i++){
			plose+=dp[n][i];
		}
		printf("Case #%d: %d\n",cas,(int)(1.0/plose));
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值