牛客32708G - ICPC2021 · 昆明 - Glass Bead Game
题意
- 给出一个长度为 n(n≤100) 的排列,数字 k 被选中的概率是 pk
- 刚开始序列是 1,2,3,…n 有序的。
- 现在随机选择一个元素(注意数字 k 被选中的概率是 pk),将它移动到序列最前。假如选择的元素是从前往后第 i 个,那么花费是 i−1。
- 现在进行了无穷次上述操作,问第无穷次操作代价的期望。
思路
- 能观察到,进行了无穷次操作以后,这 n! 种排列,每一种排列的概率不均等。
- 因此,这个答案是错误的:ans=∑(pi×n0+1+2+…(n−1))
- 考虑针对每个元素算贡献
- 对于标有数字 k 的元素,它被选中的概率是 pk,假设排在它前面的元素数量的期望为 x,那么它对答案的贡献为 x×pk
- 排在它前面的元素数量的期望 x 怎么计算?
- 考虑条件概率
- 对于标有数字 i 的元素,它前面的元素数量的期望 x=pi+p1p1+pi+p2p2+…pi+pi−1pi−1+pi+pi+1pi+1+…pi+pnpn
- ans=∑x×pi
代码
double ans = 0;
for (int i=1; i<=n; i++)
{
double sum = 0;
for (int j=1; j<=n; j++)
{
if(i == j)
continue;
sum += pi[j] / (pi[i]+pi[j]);
}
ans += sum*pi[i];
}
printf("%.10lf\n",ans);