0%

进电梯

n个人在排成一队在电梯面前,最前面的人每一秒钟会进行一次选择,有p的概率进电梯,有1-p的概率停在原地。每个人只有他前面的人都进电梯了,他才有可能进电梯。求t秒之后,进电梯人数的期望值。

输入描述:

一行三个数n t p(n,t是不超过2000的整数;p是浮点数,范围在[0,1]之间)。

输出描述:

输出t秒钟后,电梯中人数的期望值。保留6位小数。

示例1
输入

1 1 0.50

输出

0.500000

填表法:
dp[i][j] = dp[i-1][j] * (1-p) + dp[i-1][j-1] * p

刷表法:
dp[i+1][j] += dp[i][j] * (1-p)
dp[i+1][j+1] += dp[i][j] * p

jindianti.cppview raw
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <cstdio>
using namespace std;

const int N = 2010;
double dp[N][N];
int n, t;
double p;

int main(){

scanf("%d%d%lf", &n, &t, &p);
// cin>>n>>t>>p;

for(int i=1;i<=n;i++) dp[0][i] = 0;
dp[0][0] = 1;
for(int i=1;i<=t;i++){
dp[i][0] = dp[i-1][0] * (1-p);
for(int j=1;j<=(i,n-1);j++) {
dp[i][j] = dp[i-1][j] * (1-p) + dp[i-1][j-1] * p;
}
if(i>=n) dp[i][n] = dp[i-1][n] + dp[i-1][n-1] * p;
}

double ans = 0;
for(int i=1;i<=n;i++)
ans += dp[t][i] * i;
printf("%.6lf\n", ans);
return 0;
}