8月22日模拟赛 T0 小W的玻璃弹珠 题解
爹级思维题。为什么是 T0 啊 nmd
题意简述
给出一个栈,你需要向其中按顺序投入
数据范围:
思路分析
分析个头。分析不出来。直接讲做法。
考虑如果采用传统的方法,会发现状态与状态之间的重复极其难以处理。也就是说,我们应该按照放入的顺序逐个珠子进行考虑,这样就不需要管状态重复了。
自然想到设 122212221,l=3。在这个例子中,前
那么,我们考虑如何判断一个状态是否能够被完全消除。显然,这等价于
若
,则意味着栈空,我们向栈中任意放入一个弹珠,都将转移到 ,因为这一颗新的弹珠一定要被消除一次。那么,我们直接 。 若
,则意味着栈非空,这意味着栈顶一定至少仍存在一颗弹珠,且目前栈顶的连续同色弹珠数量还不足以被消除。 <1> 若新放入的弹珠与原本的栈顶颜色不同,那么这颗新的弹珠一定要被消除一次。也就是说,它一定无法和此前的同色弹珠被同一次消除,因为它们之间隔着异色的弹珠。又由于这颗新的弹珠有
种颜色可选,我们做 。 <2> 若新放入的弹珠与原本的栈顶颜色相同,由于栈顶一定至少仍存在一颗弹珠,且目前栈顶的连续同色弹珠数量还不足以被消除,这颗新的弹珠一定可以跟栈顶弹珠同时被消除,即不需要多被消除一次。我们做
。 注意:我们并不关心栈顶的颜色究竟是什么,我们只关心栈是否为空。在上述 2.<2> 情况中,有可能出现栈顶的弹珠变为可以被消去。此时,我们仍然能够根据
对栈空与否进行判断。可以理解为我们在不做任何操作的情况下将栈顶的弹珠消去了。
最终输出
代码
1 |
|