有n个人,每秒有p的概率有一个人进电梯,问t秒后电梯里的人数的期望。
因为有人数上限,所以要使用二维记录当前时间和人数。之后根据概率进行状态转移。
注意每个阶段概率和为1,编程上更新后继状态更简单。
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define all(x) (x).begin(), (x).end()
#define for0(a, n) for (int (a) = 0; (a) < (n); (a)++)
#define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++)
#define mes(a,x,s) memset(a,x,(s)*sizeof a[0])
#define mem(a,x) memset(a,x,sizeof a)
#define ysk(x) (1<<(x))
typedef long long ll;
typedef pair<int, int> pii;
const int INF =0x3f3f3f3f;
const int maxn= 2000 ;
int N,T;
double p;
double dp[maxn+3][maxn+3];
int main()
{
std::ios::sync_with_stdio(false);
while(cin>>N>>p>>T)
{
mem(dp,0);
dp[0][0]=1;
for(int t=0;t<T;t++)
{
for(int n=0;n<N ;n++ )
{
dp[t+1][n]+= (1-p)*dp[t][n];
dp[t+1][n+1]+= p*dp[t][n];
}
dp[t+1][N]+=dp[t][N];
}
double ans=0;
for(int n=0;n<=N;n++)
{
ans+=n*dp[T][n];
}
printf("%.6f\n",ans);
}
return 0;
}
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define all(x) (x).begin(), (x).end()
#define for0(a, n) for (int (a) = 0; (a) < (n); (a)++)
#define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++)
#define mes(a,x,s) memset(a,x,(s)*sizeof a[0])
#define mem(a,x) memset(a,x,sizeof a)
#define ysk(x) (1<<(x))
typedef long long ll;
typedef pair<int, int> pii;
const int INF =0x3f3f3f3f;
const int maxn= 2000 ;
int N,T;
double p;
double dp[maxn+3][maxn+3];
int main()
{
std::ios::sync_with_stdio(false);
while(cin>>N>>p>>T)
{
mem(dp[0],0);
dp[0][0]=1;
for(int t=1;t<=T;t++)
{
dp[t][0]=(1-p)*dp[t-1][0];
for(int n=1;n<N ;n++ )
{
dp[t][n]= (1-p)*dp[t-1][n]+ p*dp[t-1][n-1];
}
dp[t][N]=dp[t-1][N]+p*dp[t-1][N-1];
}
double ans=0;
for(int n=0;n<=N;n++)
{
ans+=n*dp[T][n];
}
printf("%.6f\n",ans);
}
return 0;
}