[关闭]
@gzyqwq 2019-10-23T03:04:27.000000Z 字数 7679 阅读 465

期望整理&&期望学习笔记&&期望入门

我以后再也不写纸质整理报告了,纸上一直爽,一直纸上一直爽。

前言:

转载自dsr的https://www.cnblogs.com/dsrdsr/protected/p/11373538.html

常用技巧及其套路


当n趋于oo时候

期望的线性性。

前缀和技巧
对于离散变量。

小例题1

个随机变量 ,每个随机变量都是从
随机一个整数,求 的期望
解:

小例题2

概率为 的事件期望 次后发生
你:这不显然吗?我:…………





拿球问题

典例1.

箱子里有 个球 ,你要从里面拿 次球,拿了后不放
回,求取出的数字之和的期望
解:

典例2.

箱子里有 个球 ,你要从里面拿 次球,拿了后放
回,求取出的数字之和的期望
小学老师教过我们,放不放回他们的概率是相等的。

典例3.

箱子里有 个球 ,你要从里面拿 次球,拿了后以
的概率放回,以 的概率放回两个和这个相同的球,
求取出的数字之和的期望
感性吧,我都忘了。
每个球都是相等的,所以每个球都有概率被选中,
都有同样的概率被放回去,也都有同样的概率放回两个.
所以选的概率都是

游走问题

典例1.

在一条 个点的链上游走,求从一端走到另一端的概率
表示走到的步数。




典例2.

在一张 个点的完全图上游走,求从一个点走到另一个点的概率
每个点都是等价的,,所以期望就是n-1次成功。

典例3.

在一张 个点的完全二分图上游走,求从一个点走到另一个点的概率
还是左边等价,右边等价。
A:同侧
B:异侧
4.在一张 个点的菊花图上游走,求从一个点走到另一个点的概率
A:根->叶
B:叶->根
C:叶->叶

典例5.

在一棵 个点的树上游走,求从根走到 的期望步数
从i开始游走,走到的步数,的度数

典例6.

构造一张个点的无向图,使得上面从 走到 的随机游走期望步
数>=1000000
棒棒糖图: 1000个点构造一个完全图,然后里面找一个点连出一条链子。
这个期望步数差不多是

经典问题

典例1.

每次随机一个 的整数,问期望几次能凑齐所有数
一直选,直到出现没出现过的数字。


典例2.

随机一个长度为 个排列 ,求 是最大的数的概率
,最大值有i个位置可以挑。

典例3.

问满足上面那个题的 的个数的平方的期望





因为相互独立

典例4.

随机一个长度为 的排列 ,求 的后面的概率

合法的位置可以颠倒过来嘛。

典例5.

随机一个长度为 的排列 ,求它包含 作为子序列/连续子序列的概率
子序列:
乱排,剩下的m顺序不变,插入n中,从n中选出m个位置。
连续子序列:
不是一个个插入n中了,是找个缝全钻进去。

典例6.

堆石头,第 堆个数为 ,每次随机选一个石头然后把那一整堆都扔了,求第 堆石头期望第几次被扔
看不懂

典例7.

随机一个长度为 串,每个位置是 的概率是 ,定义 是每段连续的 的长度的平方之和,求
连续1的最长长度。价值。




典例8.

给一个序列,每次随机删除一个元素,问 在过程中相邻的概率

考虑交换x和i的位置,
就是求len个数中,i,j(可颠倒)总是在后面的概率,

典例9.

给定一棵树,将他的边随机一个顺序后依次插入,求 期望什么时候连通
u,v,路径上的边全连上才会联通,其他变雨我无瓜。
枚举第几次恰好联通

典例10.

个数,每次随机选择一个还在的数并且删掉他的所有倍数,求期望几次删完
每次选一个还在的数删掉,然后标记他的倍数。
没标记前被删掉的期望。

期望线性性问题

典例1.

给定 个硬币,第 个硬币的价值为 ,每次随机取走一个硬币,获得的
收益是左右两个硬币的价值的乘积,求期望总价值.

还是差不多的,

典例2.

有 N 个数 a[1…N],每次等概率选出两个数,然后合并成?一个新的数放回
来,得到的收益是新的数的值,求总收益的期望
x_i为出现次数。


感觉这个可以拿出来

典例3.

给定一个数列 ,随机一个排列 ,如果
大,就获得 的收益,求期望收益

典例4.

给出一棵树,一开始每个点都是白的,每次选一个白点将他子树里所有点染
黑,求期望几次染黑整个树
在父亲被染黑之前才有贡献。

典例5.

个黑球,个白球,每次等概率取出一个球(不放回),将取出来的球
的颜色写成一个序列,求 的期望出现次数
可能是错的过程:
中,考虑第个数为,概率为
为0的概率为
可能是正确的答案:
整得答案就是

一些例题

1.换教室

链接

loj

思路

f[i][j][0/1] 前i个人,用了j次机会,第i节课有没有申请过。

代码

  1. #include <bits/stdc++.h>
  2. #define FOR(i, a, b) for (int i = a; i <= b; ++i)
  3. const int _ = 2019;
  4. const double INF = 0x3f3f3f3f;
  5. using namespace std;
  6. int read() {
  7. int x = 0, f = 1;char s = getchar();
  8. for (; s>'9' || s<'0';s = getchar()) if (s == '-') f = -1;
  9. for (; s>='0' && s<='9'; s = getchar()) x = x * 10 + s - '0';
  10. return x * f;
  11. }
  12. int n, m, v, e, c[_], d[_], dis[_][_];
  13. double f[_][_][2], k[_];
  14. int main() {
  15. n = read(), m = read(), v = read(), e = read();
  16. FOR (i, 1, n) c[i] = read();
  17. FOR (i, 1, n) d[i] = read();
  18. FOR (i, 1, n) scanf("%lf", &k[i]);
  19. FOR (i, 1, v) FOR (j, 1, v) dis[i][j] = (i != j) * INF;
  20. FOR (i, 1, e) {
  21. int u = read(), v = read();
  22. dis[v][u] = dis[u][v] = min(dis[u][v], read());
  23. }
  24. FOR (k, 1, v) FOR (i, 1, v) FOR (j, 1, v)
  25. dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
  26. FOR (i, 1, n) FOR (j, 0, m) f[i][j][0] = f[i][j][1] = INF;
  27. f[1][0][0] = 0, f[1][1][1] = 0;
  28. FOR (i, 2, n) {
  29. FOR (j, 0, m) {
  30. f[i][j][0] = min(f[i - 1][j][0] + 1.0 * dis[c[i - 1]][c[i]],
  31. f[i - 1][j][1] + k[i - 1] * dis[d[i - 1]][c[i]] + (1.0 - k[i - 1]) * dis[c[i - 1]][c[i]]);
  32. if(j) {
  33. f[i][j][1] = min(f[i - 1][j - 1][0] + k[i] * dis[c[i - 1]][d[i]] + (1 - k[i]) * dis[c[i - 1]][c[i]],
  34. f[i - 1][j - 1][1] + k[i] * k[i - 1] * dis[d[i - 1]][d[i]] + k[i] * (1 - k[i - 1]) * dis[c[i - 1]][d[i]] +
  35. (1 - k[i]) * k[i - 1] * dis[d[i - 1]][c[i]] + (1 - k[i]) * (1 - k[i - 1]) * dis[c[i - 1]][c[i]]);
  36. }
  37. }
  38. }
  39. double ans = INF;
  40. FOR (i, 0, m) ans = min(ans, min(f[n][i][0], f[n][i][1]));
  41. printf("%.2f\n", ans);
  42. return 0;
  43. }

2.Deep Dark Forest(树的期望直径)

题目大意

给出一棵树,其中每条边的长度有 的概率是
概率是 ,求直径的期望

思路






枚举这个,就叫他
表示i这颗子树内,从i到下最长的深度为j。

然后枚举.

3.球染色

题目大意

个球,一开始颜?色是 ,每次随机一对数
,求让 全部相同的期望步数

思路

每种颜色都是等价的
为有了i个目标颜色,还要期望走步全部变为x
俩都是x或者都不是x
x变为不是x
不是x变为x

4.拓扑排序

题目大意

给定一张个点的有向图,表示边集的拓扑序个
数,现在随机取一个边的子集,求的期望。

思路

WTF,他在说啥。

5.单选错位

链接

luogu

思路

权为1,求期望就是求概率。
前面ans和后面ans相等,期望的线性性拆开.
分开算。

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n, a, A, B, C, first, las, now;double ans;
  4. int main() {
  5. scanf("%d%d%d%d%d",&n,&A,&B,&C,&first);
  6. las = first;
  7. for (int i = 2; i <= n; i++) {
  8. int now = (1LL * las * A + B) % 100000001;
  9. int x = las % C + 1, y = now % C + 1;
  10. ans += 1.0 * min(x, y) / x / y;
  11. las = now;
  12. }
  13. las = las % C + 1, first = first % C + 1;
  14. ans += 1.0 * min(las, first) / las / first;
  15. printf("%.3f\n", ans);
  16. return 0;
  17. }

6.区间翻转

题目大意

给定一个长度为 串,每次随机一个区间将里面所有元素翻转
次操作后 的期望个数

思路

被覆盖的概率为
所以每一位上的1都是等价的,0也一样。
考虑每一位的概率(即期望)。




矩阵快速幂维护一下就做完了。

7.区间交

题意

我们定义一种随机区间的方法:


现在这样随机出两个区间,求他们相交的概率

思路

为区间右端点的概率

f为g的前缀和,枚举靠右区间的端点

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int _=1e6+7;
  4. int n;
  5. double g[_], f[_], ans;
  6. int main() {
  7. scanf("%d", &n);
  8. for (int i = 1; i <= n; ++i) {
  9. g[i] = g[i - 1] + 1.0 / n / (n - i + 1);
  10. f[i] = f[i - 1] + g[i];
  11. ans += f[i];
  12. }
  13. printf("%.8f\n", ans);
  14. return 0;
  15. }

8.凸包的期望

链接

我找到了,不过是个私密网站,真抠。
不过他们的凸包期望面积题解还是能看的

题目大意

个点,随机选一个点集,求二维凸包的期望点数

保证没有三点共线

思路

枚举两点。它为凸包上的线段当且仅当所有的点都在同侧.
期望为
复杂度
三维凸包也差不多,好想要用欧拉定理。

代码

  1. FOR(i,1,n) FOR(j,1,n) {
  2. if(i==j) continue
  3. int tmp=2*p[i]*p[j];
  4. FOR(k,1,n) {
  5. if(k==i||k==j) continue
  6. if(onleft(i,j,k)) tmp*=1-p[k];
  7. }
  8. ans+=tmp;
  9. }

9.KILL

题目大意

一个游戏有 n 个人,规则是这样的:
1. 随机选择一个还没死的人,让他活着离开
2. 活着离开之前,他会向剩下所有人开一枪,有 的概率致死
重复以上步骤直到所有人要么死了要么离开了
求一个?人活着离开且一共被开了 枪的概率

思路

表示剩下i个,已经开了j抢了。
这个男银勒了,
他是欧皇,

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注