CF2023 - D. Many Games

weirdoX發表於2024-10-22

先讓 \(p\) 除以 \(100\),相當於給你兩個陣列 \(p, w\),然後要選擇下標集合 \(S\),使得:

\(p\) 的積乘上 \(w\) 的和最大化。

注意到 \(p_i\) 是整數,並且 \(1\le p_i \le 100\)

那麼容易想按照 \(p_i\) 分類。

然後 \(w_i\) 對於固定 \(p\) 一定是選擇排序後的最大值字尾。

目前 \((P,Q)\),考慮選擇 \(i\)

\[P\cdot W \to P\cdot p_i\times(W+w_i) \]

一定是後面的式子大於前面的式子才會選擇,考慮做比例,那麼不等式就是:

\[p_i+\frac{p_i\cdot w_i}{W} > 1\\ p_i\cdot w_i>(1-p_i)\cdot W \]

\(p\) 再乘回去:

\[p_i\cdot w_i>(100-p_i)\cdot W \]

題意有:\(p_i\cdot w_i \le 2\cdot 10^5\)

所以 \(W\) 最後不會很大,只會在 \(2\cdot 10^5\) 以內。

然後我們考慮按 \(p_i\) 分類。

假設選擇了某個 \(p_i\) \(c\) 個,然後考慮選入的最小的值是 \(w_i\),考慮它不能刪除時:

令:\(q_i=p_i/100\)

\[P\cdot q_i^c\times(W+w_i\cdot c+\Delta) > P\cdot q_i^{c-1}\times(W+w_i\cdot(c - 1) + \Delta)\\ q_i\cdot(W+w_i\cdot c+\Delta) > W+w_i\cdot(c - 1) + \Delta\\ (q_i-1)\cdot w_i\cdot c > (W + \Delta)(1-q_i) -w_i \]

然後只需要考慮 \(\Delta=0\) 的情況,限制更加嚴格:

\[(q_i-1)\cdot w_i\cdot c > W(1-q_i) -w_i\\ c < -\frac{W}{w_i}+\frac{1}{1-q_i}<\frac{100}{100-p_i} \]

也就是說對於一種機率 \(p_i\) 的物品,最多選擇 \(\frac{100}{100-p_i}\)

\[\sum_{i=0}^{99}\frac{100}{100-p_i} = 100\ln 100\approx482 \]

然後對於機率等於 \(100\) 的物品無腦全部選入即可。

這裡直接用 \(dp_{i,j}\) 表示考慮完前 \(i\) 物品,目前 \(W=j\) 時的最大的 \(P\)

最終複雜度就是 \(O(2\cdot 10^5\times 482)\)

程式碼