11.2 煉石模擬賽

g1ove發表於2024-11-02

T1

貪心即可。

T2

考慮貪心。

觀察 1

不能出玩偶的機子應該最後修。

所有欽定不出玩偶的機子都是平凡的,就是假在這裡了!

觀察2

所有人一起修機是最優的。

觀察3

對於所有欽定出玩偶的機子,應該按照 \(b\) 陣列從小到大排序後修理。


有以上的觀察,不難發現應該按照 \(b\) 陣列排序。然後若選定了玩偶,應該從前往後修。手玩一下(主要是看 \(n\) 的範圍) 知道貪心是不可取的,定義 \(f_{i,j,k}\) 表示前 \(i\) 個機子,有 \(j\) 個玩偶,破譯了 \(k\) 臺機子最小時間。

有轉移:

啥也不幹:\(f_{i,j,k}=f_{i-1,j,k}\)

不用玩偶:$$f_{i,j,k}=f_{i-1,j,k-1}+\frac{a_i}{j+1}$$

用:$$f_{i,j,k}=f_{i-1,j-1,k-1}+\frac{b_i}{j}$$

時間複雜度 \(O(n^3)\),一看就正確

牛魔的怎麼假了


重新思考一下,列舉一個 \(x\) 表示強制取 \(x\) 個玩偶時的情況。

如果一個數不取,那麼時間應該是 \(\frac{a_i}{x+1}\)

式子就是:\(\sum\limits_{i=1}^x \frac{b_i}{i}+\sum\limits^{m-x}_{i=1}\frac{a_i}{x+1}\)

每次都重新 dp 一次是 \(O(n^4)\),很不妙。

大膽猜測可以三分。這次不會假吧?


對了。但是 \(O(n^3\log n)\) 肯定超了。

\(O(\log n)\) 列舉一個 \(x\),發現不管是 \(a_i\) 還是 \(b_i\) ,都是選定以後貪心的往後選一些數。所以如果取了某些 \(a_i\) ,然後就是取所有沒有取的 \(b_i\),不好貪。

發現一個性質,就是不取就是不優的。

維護狀態 \(f_{i,j}\) 表示前 \(i\) 個玩偶,取了 \(j\) 個玩偶的最小值,轉移:

\(f_{i,j}=\min(f_{i-1,j-1}+\frac{b_i}{j},f_{i-1,j}+\frac{a_i}{x+1})\)

重要的:結算狀態是 \(f_{i,x}\),往後維護即可。

細節似乎有點多。不想寫。(調不出來了)


嘿嘿調過了,時間複雜度 \(O(n^2\log n)\),薄紗標程。


T3