加载中...

牛客周赛100 G(期望dp)

G

一个显然的贪心:成功概率大的 \(b_{i}\) 一定分配给需要变成更大的数。因此排序后,整个问题便被划分成了 \(n\) 个独立的子问题,每个子问题的形式为:需要将一个数经某种操作从 \(0\) 变为 \(i\),其中该操作有 \(b_{i} \%\) 的概率将该数加 \(1\),否则(即 \(1 - b_{i} \%\) 的概率)若该数 \(>0\)\(1\)\(=0\)不变,求期望操作次数。

定义 \(dp_{x}\):将 \(x-1\) 变为 \(x\) 需要操作数的期望次数

由状态定义:\(ans = \sum_{i=1}^{x}dp_{x}\)

状态转移分两种情况:

  1. 第一次操作成功:概率 \(b_{i} \%\),共需要一次操作。
  2. 第一次操作失败:概率 \(1 - b_{i}\%\),操作后又分两种情况:
  • \(x=1\) \(\Rightarrow\) 无变化,当前值仍为 \(x-1\)

\[dp_{x} = b_{i}\% * 1 + (1-b_{i}\%)*(1 + dp_{x}) \]

  • \(x>1\) \(\Rightarrow\) 失败后当前值变为 \(x-2\) \(\Rightarrow\) 需要先变为 \(x-1\),再变为 \(x\)

\[dp_{x} = b_{i}\% * 1 + (1-b_{i}\%)*(1 + dp_{x-1} + dp_{x}) \]

化简求出 \(dp_{x}\),再求出 \(ans\) 即可。

吐槽一下蒟蒻补题的过程:推式子及其折磨人。最后终于推出了一大坨,一长串式子作为答案,用 python 又码了很长时间,怎么改都是超时。最后让AI帮我把代码改成CPP版本才过qwq。看来做算法题还是得用CPP呐。。。

code

\(upd\):蒟蒻后来发现python选错版本了,应该选pypy3,而之前一直用的python3(悲。。。

后来发现不需要推式子:\(b_{i}\) 的取值只有 \(100\) 种,因此将所有的 \(dp[b[i]][1到n]\) 求出,并在递推过程中作前缀和即可,复杂度 \(O(100n)\)

code

posted @ 2025-07-13 23:54  jxs123  阅读(10)  评论(0)    收藏  举报