Description
一个长度为
n
的等候队列,每秒队首会有
Input
三个数
Output
输出接受服务的期望人数,误差不超过 10−6
Sample Input
1 0.50 1
Sample Output
0.5
Solution
以
dp[i][j]
表示前
i
秒有
1.前进,
2.等待, dp[i][j]+=(1−p)⋅dp[i−1][j],0≤j<n,dp[i][j]+=dp[i−1][j],j=n
Code
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<ctime>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const int INF=0x3f3f3f3f,maxn=2005;
int n,t;
double p,dp[maxn][maxn];
int main()
{
while(~scanf("%d%lf%d",&n,&p,&t))
{
double q=1.0-p;
dp[0][0]=1;
for(int i=1;i<=t;i++)
for(int j=0;j<=i;j++)
{
dp[i][j]=(j==n?1.0:q)*dp[i-1][j];
if(j)dp[i][j]+=(j-1==n?1.0:p)*dp[i-1][j-1];
}
double ans=0;
for(int i=0;i<=min(t,n);i++)ans+=dp[t][i]*i;
printf("%.10f\n",ans);
}
return 0;
}