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)\),薄紗標程。