我操,CF 彻底怒了。CF 指出了最核心的矛盾点:如果我在打题时不听音乐,怎么可能切不出来这题?这确实是我的严重错误。我需要彻底承认边打题边听音乐毫无用处,重新集中注意力。
然后这题很智慧,只需要一点点注意力就可以。
首先就是利用这个条件限制问题吧,因为题目说是贪心地放方块,于是考虑如果如果我们第一个放了 \(t\),那么之后最多只能再使用 \(\min((t+1)^3 - 1 - t^3, m - t ^ 3)\) 了。
这个东西说明:往小选未必更优。
令 \(a = m ^ {\frac{1}{3}}\) 向下取整。然后我们考虑,对于这个 \(m\):
-
选 \(a\),那么剩下的有 \(m - a ^ 3\)。
-
选 \(a - 1\),那么剩下的有 \(\min(m - (a - 1) ^ 3, a ^ 3 - (a - 1) ^ 3 - 1) = a ^ 3 - (a - 1) ^ 3 - 1\)。
-
选 \(a - 2\),那么剩下的有 \(\min(m - (a - 2) ^ 3, (a - 1) ^ 3 - (a - 2) ^ 3 - 1) = (a - 1) ^ 3 - (a - 2) ^ 3 - 1\)。
容易注意到选 \(a - 2\) 不可能比 \(a - 1\) 更优。
然后我们注意到答案不可能很大,最大 \(18\),于是就肯定直接设计递归函数。
\(solve(m)\) 返回目前剩余的总体积最大为 \(m\) 的所有答案二元组【使用块数,使用体积】中字典序最大的那一个。然后转移其实很简单了,目前我们只能选 \(a\),\(a - 1\),因为根据以上分析,选择更小的不可能更优。
注意到 \(m\) 的衰减其实很快,时间 \(\mathcal{O}(能过)\)。
然后是刚好因为 Mike 在打原神,所以 In queue 一万年才过的代码。
