题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2422
题目大意:每天晚上你都玩纸牌,如果第一次就赢了,就高高兴兴的去睡觉,如果输了就继续玩。假如每盘游戏你获胜的概率都为p,每盘游戏输赢独立。如果当晚你获胜的局数的比例严格大于p时才停止,而且每天晚上最多只能玩n局,如果获胜比例一直不超过p的话,以后就再也不玩纸牌了。问在平均情况下,你会玩多少个晚上纸牌。
解题思路:这题和毛球的题比较相似,每天晚上的情况相互独立,先研究单独一天的情况,只玩一晚上纸牌,垂头丧气的睡觉的概率Q.
设d[i][j]表示前i局中每局结束后的获胜比例不超过p ,且前i局一共获胜 j 局的概率.
则根据全概率公式 有j/i<=p时,d[i][j]=d[i-1][j]*(1-p)+d[i-1][j-1]*p;其它情况d[i][j]=0;边界为d[0][0]=1,d[0][1]=0;
则Q=d[n][0]+d[n][1]+d[n][2]+...d[n][n].
法1:
用数学期望的定义计算游戏总天数X的数学期望。
X=1 的概率为Q
X=2的概率为Q*(1-Q)
X=3的概率为Q*(1-Q)^2
。。。
X=k的概率为Q*(1-Q)^(k-1)
故EX=Q+2*Q*(1-Q)+...+k*Q*(1-Q)^(k-1)+... ①
令s=EX/Q=1+2*(1-Q)+3*(1-Q)^2+...
则 (1-Q)*s=(1-Q)+2(1-Q)^2+... ②
①-②得EX=Qs=1+(1-Q)+(1-Q)^2+...=1/Q;
法2:
设数学期望为e,情况分两类:
第一天晚上垂头丧气,概率为Q,期望为1;
第一天晚上高高兴兴,概率为(1-Q),期望为e+1;
得方程:e=Q*1+(e+1)*(1-Q); 得e=1/Q;
代码如下:
#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
int T,a,b,n,cas=1;
scanf("%d",&T);
while(T--)
{
scanf("%d/%d%d",&a,&b,&n);
double p=(double)(a*1.0/b*1.0);
double d[105][105];
memset(d,0,sizeof(d));
d[0][0]=1.0;d[0][1]=0.0;
for(int i=1;i<=n;i++)
for(int j=0;j*b<=i*a;j++)
{
d[i][j]=d[i-1][j]*(1-p);
if(j) d[i][j]+=d[i-1][j-1]*p;
}
double Q=0.0;
for(int j=0;j*b<=a*n;j++)
Q+=d[n][j];
printf("Case #%d: %d\n",cas++,(int)(1/Q));
}
return 0;
}