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

被折叠的 条评论
为什么被折叠?



