乘坐电梯
金牌导航 期望-2
题目大意
有n个人,对于没一个单位时间有p的概率最前面的1个人进电梯,有(1-p)的概率不进,问你t个单位时间后,电梯中的期望人数
样例输入 1
1 0.50 1
样例输出 1
0.5
样例输入 2
1 0.50 4
样例输出 2
0.9375
样例输入 3
4 0.20 2
样例输出 3
0.4
数据范围
1⩽n,t⩽20001\leqslant n,t\leqslant 20001⩽n,t⩽2000
0⩽p⩽10\leqslant p\leqslant 10⩽p⩽1
解题思路
设fi,jf_{i,j}fi,j为i个单位时间后,电梯中有j个人的期望值
那么有
fi+1,j+1+=fi,j×pfi+1,j+=fi,j×(1−p)\begin{aligned}f_{i + 1,j + 1} & += f_{i,j} \times p \\ f_{i + 1,j}& += f_{i,j} \times (1 - p)\end{aligned}fi+1,j+1fi+1,j+=fi,j×p+=fi,j×(1−p)
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n, t;
double p, ans, f[2021][2021];
int main()
{scanf ("%d%lf%d", &n, &p, &t);f[0][0] = 1;for (int i = 0; i < t; ++i){f[i + 1][n] += f[i][n];//全都进了那就100%没人会再进for (int j = 0; j < n; ++j){f[i + 1][j + 1] += f[i][j] * p;//进f[i + 1][j] += f[i][j] * (1 - p);//不进}}for (int i = 0; i <= n; ++i) ans += f[t][i] * i;//计算结果printf("%.6lf", ans);return 0;
}