【专题】概率期望

前言

期望的计算公式:

\[E(X) = \sum_i{i\times P(x=i)} \]

感性理解:对于一个事件\(X\),可能有各种情况,其中某情况的贡献是\(i\),实际上的情况是\(x\),事件发展成该情况的概率是\(P(x=i)\)

例子:有一堆盲盒,随便抽一个打开,得到奖励的期望是\(E(X)\),一个盲盒里装的奖励值是\(i\),抽到这个盲盒的概率是\(P(x=i)\)

又或者,在这堆盲盒中,不止一个盲盒的奖励值是\(i\),而在所有奖励值不同的盲盒中,最终抽到的奖励值\(x\),而抽到的恰好就是奖励值为\(i\)的盲盒的概率即为\(P(x=i)\)

期望的线性性:

\[E(X+Y) = E(X)+E(Y), E(kX) = kE(X) \]

例题

Game on Tree

CF280C Game on Tree

题目描述

给定一棵有根树,结点编号从 \(1\)\(n\)。根结点为 \(1\) 号结点。

对于每一次操作,等概率的选择一个尚未被删去的结点并将它及其子树全部删去。当所有结点被删除之后,游戏结束;也就是说,删除 \(1\) 号结点后游戏即结束。

要求求出删除所有结点的期望操作次数。

解:

每个节点的贡献均为\(1\)

\[E(X) = \sum_u p_u \]

一个节点能产生贡献当且仅当其祖先均未在它之前删除,则\(p_u = \frac{1}{dep_u+1}\)(此处令\(dep_1=0\),若\(dep_1=1\)则不需\(+1\)


xelsp友情赞助。

百事世界杯之旅

[SHOI2002]百事世界杯之旅

题目描述

假设有 \(n\) 个不同的球星名字,每个名字出现的概率相同,平均需要买几瓶饮料才能凑齐所有的名字呢?

解:

\(f(i)\)表示现在收集了\(i\)个球星名字的情况下,还需要购买饮料的期望次数。

\[f(i)=1+\frac{i}{n}f(i)+\frac{n-i}{n}f(i+1) \]

显然\(f(n)=0\),于是倒推出\(f(0)\)就得到答案了。

然后进行一个自己推自己,就得到了:

\[f(i)=f(i+1)+\frac{n-i}{n} \]

这题的输出格式有点谔谔

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long

int get(int x){
	int ret = 0;
	while(x){
		ret++;
		x /= 10;
	} return ret;
}

int gcd(int x, int y){
	if(!x) return y;
	return gcd(y%x, x);
}

// f(x) = f(x+1)(n-x)/n + f(x)x/n + 1
signed main(){
	int n; scanf("%lld", &n);
	int ans1 = 0, ans2 = 1;
	for(int i = 0; i < n; i++){
		ans1 = ans2*n+ans1*(n-i);
		ans2 *= n-i;
		int qwq = gcd(ans1, ans2);
		ans1 /= qwq, ans2 /= qwq;
	}
	if(ans1 % ans2 == 0){
		printf("%lld\n", ans1/ans2);
		return 0;
	}
	int ans3 = ans1/ans2;
	ans1 = ans1%ans2;
	for(int i = 1; i <= get(ans3); i++)
		putchar(' ');
	printf("%lld\n", ans1);
	if(ans3) printf("%lld", ans3);
	for(int i = 1; i <= get(ans2); i++)
		putchar('-'); putchar('\n');
	for(int i = 1; i <= get(ans3); i++)
		putchar(' ');
	printf("%lld\n", ans2);
	return 0;
} 

收集邮票

收集邮票

2024.11.14.update:重温本题,结合洛谷其他dalao的题解,采用了更易于理解的说法

题目描述

\(n\)种邮票,每次买一张,买到每种邮票的概率是相同的(\(\frac{1}{n}\)),但是每次购买邮票的费用不同,第\(k\)次购买需要支付\(k\)元钱。

问收集所有种类的邮票的期望花费。(输出保留二位小数)

解:

如果买了\(m\)次邮票,则花费为\(c=\frac{(m+1)m}{2}\)
根据期望的线性性,\(E(c) = \frac{1}{2}[E(m^2)+E(m)]\)

那么这个问题将拆分成两个部分:购买次数的期望,\((\)购买次数\()^2\)的期望(而非期望的平方)。

根据上一题的结论,求购买次数的期望可以通过式子\(f(i)=f(i+1)+\frac{n}{n-i}\)递推求解,其中\(f(i)\)对应已有\(i\)种邮票的\(E(m_i)\)

我们可以认为\(E(m)\)的部分已经解决了。

对于\(E(m^2)\)的部分,将\(E((m+1)^2)\)拆开得\(E(m^2+2m+1)\),由期望的线性性:

\[E((m+1)^2) = E(m^2)+2E(m)+E(1) \]

显然其中的\(E(1)=1\)

\(g(i)\)表示现在收集了\(i\)种邮票的\(E(m_i^2)\)

\[g(i)=\frac{i}{n}{E((m_i+1)^2)} + \frac{n-i}{i}{E((m_{i+1}+1)^2)} \\ g(i)=\frac{i}{n}{(E(m_{i}^2)+2E(m_{i})+1)} + \frac{n-i}{n}{(E(m_{i+1}^2)+2E(m_{i+1})+1)} \\ g(i) = \frac{i}{n}{(g(i)+2f(i)+1)} + \frac{n-i}{n}{(g(i+1)+2f(i+1)+1)}\\ \]

再进行一个自己推自己,简化为:

\[g(i) = \frac{i}{n-i}{(2f(i)+1)} + {g(i+1)+2f(i+1)+1}\\ \]

\(ans(i)\)表示表示现在收集了\(i\)种邮票的\(E(c)\)

则:

\[ans(i) = \frac{1}{2}{(g(i)+f(i))} \\ \]

点击查看代码
#include <bits/stdc++.h>
using namespace std;

const int N = 10005;
double f[N], g[N];
int n;

int main(){
	scanf("%d", &n);
	f[n] = g[n] = 0;
	for(int i = n-1; i >= 0; i--){
		f[i] = f[i+1]+(double)n/(n-i);
		g[i] = (double)i/(n-i)*(f[i]*2.0+1.0)+g[i+1]+2.0*f[i+1]+1.0;
	}
	printf("%.2f\n", (g[0]+f[0])/2.0);
	return 0;
}
posted @ 2024-10-23 11:17  _kilo-meteor  阅读(16)  评论(0编辑  收藏  举报