记录编号 359671 评测结果 AAAAAAAAAA
题目名称 [UVa 11427] 玩纸牌 最终得分 100
用户昵称 Gravatar‎MistyEye 是否通过 通过
代码语言 C++ 运行时间 0.170 s
提交时间 2016-12-24 07:36:26 内存使用 0.40 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 105;
double P, PM, f[maxn][maxn];
int p, q, N, M;
int main(){
	freopen("expected.in","r",stdin);
	freopen("expected.out","w",stdout);
	int kase; scanf("%d", &kase);
	for(int o=1; o<=kase; ++o) {
		scanf("%d/%d %d", &p, &q, &N);
		P = 1.0*p/q;
		PM = 0;
		f[0][0] = 1;
		for(int i=1; i<=N; ++i) {
			f[i][0] = (1-P)*f[i-1][0];
			for(int j=1; j<=i; ++j) {
				f[i][j] = 0;
				if((j-1)*q <= p*(i-1)) f[i][j] += P*f[i-1][j-1];
				if(i!=j && j*q <= p*(i-1)) f[i][j] += (1-P)*f[i-1][j];
				if(j*q > p*i) {
					PM += f[i][j]; break;
				}
			}
		}
		/*
		 * 递推,当满足要求时直接终止并累加贡献
		 * 不从终止的地方转移过来
		 * 算出每天的成功的概率PM
		 * 然后就是一个简单的超几何分布的期望
		 */
		int ans = (int)ceil(PM/(1-PM));
		if(!ans) ans = 1;
		printf("Case #%d: %d\n", o, ans);
	}
	getchar(), getchar();
	return 0;
}