链接
https://odzkskevi.qnssl.com/685c9172494d11427dac1378680b93db?v=1537949971
题解
显然任何两个晚上之间都是没有影响的,因此我把一天晚上玩牌的胜率记为
P
P
P,答案就是
∑
i
=
1
+
∞
i
P
i
−
1
(
1
−
P
)
\sum_{i=1}^{+\infty}iP^{i-1}(1-P)
∑i=1+∞iPi−1(1−P),这个东西拆开之后就是高三做过很多次的成公比错位相减,等于
1
1
−
P
\frac{1}{1-P}
1−P1
这个
P
P
P的求法可以直接概率
d
p
dp
dp,
f
(
i
,
j
)
=
p
f
(
i
−
1
,
j
−
1
)
+
(
1
−
p
)
f
(
i
,
j
−
1
)
f(i,j)=pf(i-1,j-1)+(1-p)f(i,j-1)
f(i,j)=pf(i−1,j−1)+(1−p)f(i,j−1),其中
f
(
i
,
j
)
f(i,j)
f(i,j)表示的是我一共玩了
i
i
i盘,赢了
j
j
j盘的概率
妙解
设期望为 e e e,则 e = ( 1 − P ) 1 + P ( e + 1 ) e=(1-P)1+P(e+1) e=(1−P)1+P(e+1),解得 e = 1 1 − P e=\frac{1}{1-P} e=1−P1
代码
#include <bits/stdc++.h>
#define maxn 110
#define eps 1e-8
#define cl(x) memset(x,0,sizeof(x))
using namespace std;
double f[maxn][maxn], p, P;
int N;
int read(int x=0)
{
int c, f=1;
for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-1;
for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+c-48;
return f*x;
}
void init()
{
cl(f), P=0;
int i, j, a=read(), b=read(), n;
p=1.0*a/b;
n=read();
f[0][0]=1;
for(i=1;i<=n;i++)
{
for(j=0;j*b<=a*i;j++)
{
if(j>0)f[i][j]+=p*f[i-1][j-1];
f[i][j]+=(1.0-p)*f[i-1][j];
}
P+=p*(f[i-1][j-1])+(1.0-p)*f[i-1][j];
}
}
void work()
{
double ans=0, m=1.0;
printf("%d\n",int(1.0/(1.0-P)+eps));
}
int main()
{
int T=read(), kase=0;
while(T--)
{
printf("Case #%d: ",++kase);
init();
work();
}
return 0;
}