题意:
每天晚上玩纸牌,每局获胜的可能性为
p
,如果当晚玩到某一局获胜局数比例大于
分析:
首先明确每晚玩牌的情况是互相独立的。那么我们还是仅从一个晚上开始考虑。
定义状态
我们有
dp[i][j]=dp[i−1][j−1]∗p+dp[i−1][j]∗(1−p)
一天晚上胜率未达到
p
的概率
假设晚上玩牌的期望天数为
Ex
那么
Ex=Q∗1+(1−Q)∗(Ex+1)
解得
Ex=1/Q
最后别忘了向下取整
代码:
/*************************************************************************
> File Name: 11427.cpp
> Author: jiangyuzhu
> Mail: 834138558@qq.com
> Created Time: 2016/8/1 10:44:36
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
using namespace std;
const int maxn = 1e2 + 5;
double dp[maxn][maxn];
int main (void)
{
int T;scanf("%d", &T);
for(int tt = 1; tt <= T; tt++){
int x, y, n;
scanf("%d/%d%d", &x, &y, &n);
double p = 1.0 * x /(1.0 * y);
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for(int i = 1; i <= n; i++){
for(int j = 0; x * i >= y * j; j++){
dp[i][j] = (1.0 - p) * dp[i - 1][j] + p * dp[i - 1][j - 1];
}
}
double Q = 0;
for(int i = 0; i * y <= x * n; i++) Q += dp[n][i];
printf("Case #%d: %d\n", tt, (int)(1.0 /(double) Q));
}
return 0;
}