11.2 炼石模拟赛
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)\),薄纱标程。