乘坐电梯
题目链接:ybt金牌导航1-1-2
题目大意
有一个电梯,有 n 个人要进电梯。
对于每一秒,排在最前面的人有 p 的几率会进电梯(不会再出来),否则不进,别的人都不进。
问你 t 秒后,在电梯上的人的期望数量。
思路
这道题我们先设 f i , j f_{i,j} fi,j 为在第 i i i 秒之后有 j j j 个人在电梯上的概率。
那首先初始化很显然, f 0 , 0 = 1 f_{0,0}=1 f0,0=1。
那接着就是转移。
首先,对于普通的,我们从
f
i
,
j
f_{i,j}
fi,j 可以这样转移:
f
i
+
1
,
j
+
1
=
f
i
+
1
,
j
+
1
+
f
i
,
j
×
p
f_{i+1,j+1}=f_{i+1,j+1}+f_{i,j}\times p
fi+1,j+1=fi+1,j+1+fi,j×p 和
f
i
+
1
,
j
=
f
i
+
1
,
j
+
f
i
,
j
×
(
1.0
−
p
)
f_{i+1,j}=f{i+1,j}+f_{i,j}\times (1.0-p)
fi+1,j=fi+1,j+fi,j×(1.0−p)。
(就是对于新的一秒,最前面的人走上了电梯,或者没有走上电梯)
那如果已经没有人在等着上电梯了呢?(或者说所有人都上了电梯)
那因为上了电梯就不会下来(这话说的有点恐怖1 ),那所有人还是在电梯上,也不会有人进来。(因为你总不能说多了个人吧,队列里多了一个人2 )
所以,对于
f
i
,
n
f_{i,n}
fi,n,我们可以让
f
i
+
1
,
n
=
f
i
+
1
,
n
+
f
i
,
n
f_{i+1,n}=f_{i+1,n}+f_{i,n}
fi+1,n=fi+1,n+fi,n。
但是我们这个现在求的是期望,不是概率。
那我们知道期望就是可能结果的概率乘以其结果的总和,那我们就直接枚举
f
t
,
i
f_{t,i}
ft,i,然后
a
n
s
=
a
n
s
+
f
t
,
i
∗
i
ans=ans+f_{t,i}*i
ans=ans+ft,i∗i。
那 a n s ans ans 就是我们要的答案了。
代码
#include<cstdio>
#include<iostream>
using namespace std;
int n, t;
double p, f[2001][2001], ans;
int main() {
f[0][0] = 1;
scanf("%d %lf %d", &n, &p, &t);
for (int i = 0; i < t; i++) {//先算在第 i 秒之后电梯上有 j 个人的概率
for (int j = 0; j < n; j++) {
f[i + 1][j + 1] += f[i][j] * p;//进了电梯
f[i + 1][j] += f[i][j] * (1.0 - p);//不进电梯
}
f[i + 1][n] += f[i][n];//如果所有的人都已近电梯,就不贵出现进电梯的情况
}
for (int i = 1; i <= n; i++)//然后最后根据概率算出期望
ans += f[t][i] * i;
printf("%lf", ans);
return 0;
}