【ybt金牌导航1-1-2】乘坐电梯

乘坐电梯

题目链接: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.0p)
(就是对于新的一秒,最前面的人走上了电梯,或者没有走上电梯)

那如果已经没有人在等着上电梯了呢?(或者说所有人都上了电梯)
那因为上了电梯就不会下来(这话说的有点恐怖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,ii

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;
}

  1. 柯南第20集:电梯杀人事件 ↩︎

  2. another,懂? ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值