CF464D World of Darkraft - 2

题目大意:

你有 \(k\) 个武器,初始等级全部为 1,有 \(n\) 次操作,每次操作选一个 \(1 \le i \le k\),假设它的等级为 \(t\)
那么它的新等级是 \(1 \sim t + 1\) 中的随机的一个数,你会将伤害高的留下,将等级小的等级加到答案中。
请输出答案的期望,答案误差不能超过 \(10^{-9}\)
\(n \le 10^5, k \le 100\)

解题大意:

由于每把武器都是相同的,且几乎相互不影响。
所以可以设 \(f_{i, j}\) 表示前 \(i\) 次攻击,武器等级到了 \(j\) 的期望答案,对应的,为了转移,就得设 \(g_{i,j}\) 表示概率。
最后就是 \(f_{n, i}\) 的和乘 \(k\)
转移如下:

  1. \(i + 1\) 次操作没操作在这个武器上,那么

\[f_{i, j} \times \frac{k-1}{k} \to f_{i + 1,j} \]

  1. \(i + 1\) 次操作打在当前武器了,但没有让等级改变,那么

\[(f_{i, j} \times j + g_{i, j} \times \frac{j \times (j + 1)}{2}) \times \frac{1}{k} \times \frac{1}{j + 1} \to f_{i + 1,j} \]

  1. \(i + 1\) 次操作让武器升级了,那么

\[(f_{i, j} + g_{i, j} \times j) \times \frac{1}{k} \times \frac{1}{j + 1} \to f_{i + 1, j + 1} \]

g 转移同理。
然后我就不会了。
注意到每次转移必乘个分数,而且他允许有精度误差。
由于 \(k\) 也不是很大,所以 \(g_{i,j}\) 有值的不多,大概在 600 左右。
所以将 \(j\) 的上界设为 \(600\) 即可。
要滚动数组。
\(O(nB)\)

posted @ 2025-04-14 23:02  positive_deviation  阅读(22)  评论(0)    收藏  举报