[Procedure #3] P8866 [NOIP2022] 喵了个喵
[Procedure #3] P8866 [NOIP2022] 喵了个喵
声名远扬臭名昭著的一道 ad-hoc。
[Start]
如果任何一种卡牌有奇数张必然无解。~~~~
如果一个栈里面有一个卡牌不是通过操作 1 来消除,那么必须通过操作二才能消除。
卡牌的种类数好像很神秘啊,如果种类数不大于 \(n\) 的话,显然很容易操作:各种颜色分开放即可
如果不是这样,我们再按照这种方式去放,有可能会遇到一个堆里面存在两种颜色的情况,但是由于种类数为 \(2n-1\),所以必然有一个只有一种,就是有一个柱子是 free 的……好像没什么用。试试 \(n=2\) 的情况,此时有 \(3\) 种卡牌。
我们可以看看这样的策略,把连续的一段消掉最后变成一个相邻的都不同色的一个序列,然后再来
[Failed] 没有下一个方向 [Hint]
[Hint] 确立一个基本策略
欸,对于刚刚的情况,我好像有一种策略,先变成刚刚这个相邻不同的序列,设三种颜色为 \(a,b,c\),最开始遇到的两种颜色,我们分别将其放在两个栈内,此时遇到第三种颜色,不妨设其为 \(c\),若下一个颜色是 \(x\),那么就把 \(c\) 放到另一个的顶端(设这个颜色为 \(y\)),然后把下一个 \(x\) 和这一个抵消,然后再下一个如果是 \(c\),就抵消原来的 \(c\),如果是 \(y\) 就抵消,这样,只剩一个数了,我们重复这个策略即可。
很对啊!
而且我们消除之后,每一个显然都还是出现了偶数次,否则就说明原先就不行。
[Check Point 1]
我们可以再想想能不能拓展到 3 个牌栈的情况。
好像很难,我们先考虑一下 \(k=2n-2\),毕竟这个 \(k\) 很特殊。
成了,我们只要沿用上面的方法,我们一直留一个空位置不填,然后其他的填两层,就可保证来一个数就删一个。
[Check Point 2]
那么,\(2n-1\) 呢?如果是这样,留着一个空位置就会导致多出一个,就会放 3 个,从而有一个就不能被操作到。
如果只是直接把多的一个放在空位置上,一旦下一个给出了一个在下层的数,就无法达到我的目标。
总之我只有 \(2n-2\) 个可消除的数,这一部分必然有一个数没办法删除。考虑能不能用一种手段,一直转换那个不能删除的数,使得其能够删除。
我们结合 [Check Point 1] 的内容,只要有 2 个空位,我们就能执行任何三个的消除任务,其实即使没法执行二操作,我们可以在别的地方运行 [Check Point 1] 的方法,
[Replay]
说实话,我觉得应该少出这种题,我 [Check Point 1] 的内容其实就是把题解的策略旋转了 90 度,我是先横着填的,没有特意去保留一个特殊栈,竖着想就容易得多了,这就叫脑电波吗?奋斗两小时,就拿 35,\(n=3\) 的情况究竟是给谁得的?
Thoughts Memo
值得反思的是,[Check Point 1] 的策略其实过于复杂了,没有推广性,做这类题目的时候应该注意策略的简洁性,否则是难于扩展的。
本文来自博客园,作者:haozexu,转载请注明原文链接:https://www.cnblogs.com/haozexu/p/19047520

浙公网安备 33010602011771号