UVA 11427 Expect the Expected

解题报告:由于每天晚上垂头丧气的概率都相同,设为Q,那么可以分开处理,DP算出Q
设f[i][j]表示一共打了i场,赢了j场的概率
\(f[i][j]=f[i-1][j-1]*p+f[i-1][j]*(1-p)\)
最后\(Q=\sum_{i=0}^nf[n][i](i<=n*p)\)
最后答案即为1/Q,详细证明见蓝书

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
#define il inline
#define iter iterator
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=105;
double f[N][N];int CNT=0;
void work()
{
	memset(f,0,sizeof(f));
	int a,b,n;
	scanf("%d/%d%d",&a,&b,&n);
	double p=(double)a/(b*1.0);
	f[0][0]=1;
	for(int i=1;i<=n;i++){
		for(int j=0;j*b<=i*a;j++){
			f[i][j]=f[i-1][j]*(1-p);
			if(j)f[i][j]+=f[i-1][j-1]*p;
		}
	}
	double tot=0;
	for(int i=0;i*b<=a*n;i++)tot+=f[n][i];
	int ans=1/tot;
	printf("Case #%d: %d\n",CNT,ans);
}

int main()
{
	int T;cin>>T;
	while(T--)CNT++,work();
	return 0;
}

posted @ 2017-09-05 23:02  PIPIBoss  阅读(84)  评论(0编辑  收藏  举报