[洛谷P4550]收集邮票

题目大意:有$n(nleqslant10^4)$个物品,第$i$次会从这$n$个物品中随机获得一个,并付出$i$的代价,问获得所有的$n$个物品的代价的期望。

题解:令$f_i$表示现在已经获得了$i$种物品,取完所有物品还需的次数的期望。
$$
f_i=
egin{cases}
dfrac inf_i+dfrac{n-i}nf_{i+1}+1&(i<n)\
0&(i=n)
end{cases}\
化简得f_i=
egin{cases}
f_{i+1}+dfrac n{n-i}&(i<n)\
0&(i=n)
end{cases}\
$$
令$g_i$表示已经获得了$i$种物品,取完所有物品还需的代价的期望(假设原来的物品是凭空获得,下面的物品代价从$1$开始)
$$
g_i=
egin{cases}
dfrac in(g_i+f_i+1)+dfrac{n-i}n(g_{i+1}+f_{i+1}+1)&(i<n)\
0&(i=n)
end{cases}\
化简得g_i=
egin{cases}
dfrac i{n-i}f_i+g_{i+1}+f_{i+1}+dfrac n{n-i}&(i<n)\
0&(i=n)
end{cases}\
$$
卡点:

C++ Code:

#include <cstdio>
#define maxn 100010
int n;
double f[maxn], g[maxn];
int main() {
	scanf("%d", &n);
	for (int i = n - 1; ~i; --i) {
		f[i] = f[i + 1] + n / static_cast<double> (n - i);
		g[i] = i / static_cast<double> (n - i) * f[i] + g[i + 1] + f[i + 1] + n / static_cast<double> (n - i);
	}
	printf("%.2lf
", g[0]);
	return 0;
}

  

原文地址:https://www.cnblogs.com/Memory-of-winter/p/10348323.html