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)\),薄纱标程。


T3

posted @ 2024-11-02 11:09  g1ove  阅读(14)  评论(0编辑  收藏  举报