【做题笔记】收集邮票 做题笔记

P4550 收集邮票

展开目录

Reading

\(k\ge 1\) 时,可以通过支付 \(k\) 元钱获得一张 \(n\) 种邮票中的某种邮票。这 \(n\) 种邮票等概率出现,求买到全部 \(n\) 种邮票的花费期望。

Step 1

\(k\)\(k\) 元太难搞了,干脆直接全打成 \(1\) 元。

设买到 \(i\) 张邮票,要买完全部 \(n\) 种所需的期望价格为 \(f_i\).显然 \(f_n = 0\).

当买到 \(i\) 张邮票时,下次有 \(\frac{i}{n}\) 的概率买到有的,\(\frac{n-i}{n}\) 的概率买到没有的。

前者期望为 \(\frac{i}{n}f_i\),后者为 \(\frac{n-i}{n}f_{i+1}\).

得到总期望为:

\[f_i=\frac{i}{n}f_i+\frac{n-i}{n}f_{i+1}+1 \]

化简可得:

\[f_i=f_{i+1}+\frac{n}{n-i} \]

Step 2

接下来扩展到 \(k\)\(k\) 元。

\(g_i\) 为当前买了 \(i\) 张邮票,要买完全部 \(n\) 种的期望价格。很显然 \(g_n\) 也是 \(0\).

于是买到已经有的邮票的期望是 \(\frac{i}{n}(g_i+f_i+1)\),否则期望为 \(\frac{n-i}{n}(g_{i+1}+f_{i+1}+1)\).

所以总期望为:

\[g_i=\frac{i}{n}(g_i+f_i+1)+\frac{n-i}{n}(g_{i+1}+f_{i+1}+1) \]

化简可得:

\[g_i=\frac{n}{n-i}f_i+g_{i+1} \]

Code

因为只需要推两个式子,直接从 \(n\) 开始逆推。可以滚动优化。

展开代码
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
int n;
double f, g;
int main() {
	scanf("%d", &n);
	for(int i = n; i; --i) f += n / (n - i + 1) * 1.0, g += n * f / (n - i + 1) * 1.0;
	printf("%.2lf\n", g);
	return 0;
}

彩蛋

怎么能少了sb错误呢:

image

posted @ 2024-09-22 20:36  _Kiichi  阅读(42)  评论(0编辑  收藏  举报