【洛谷P8866】喵了个喵
1|0题目
题目链接:https://www.luogu.com.cn/problem/P8866
小 E 喜欢上了一款叫做《喵了个喵》的游戏。这个游戏有一个牌堆和 个可以从栈底删除元素的栈,任务是要通过游戏规则将所有的卡牌消去。开始时牌堆中有 张卡牌,从上到下的图案分别是 。所有的卡牌一共有 种图案,从 到 编号。牌堆中每一种图案的卡牌都有偶数张。开始时所有的栈都是空的。这个游戏有两种操作:
- 选择一个栈,将牌堆顶上的卡牌放入栈的顶部。如果这么操作后,这个栈最上方的两张牌有相同的图案,则会自动将这两张牌消去。
- 选择两个不同的栈,如果这两个栈栈底的卡牌有相同的图案,则可以将这两张牌消去,原来在栈底上方的卡牌会成为新的栈底。如果不同,则什么也不会做。
这个游戏一共有 关,小 E 一直无法通关。请你帮小 E 设计一下游戏方案,即对于游戏的每一关,给出相应的操作序列使得小 E 可以把所有的卡牌消去。
。
2|0思路
首先 的很好做,每一个元素与其前后一个相同元素匹配,把至多两个元素放在一个栈中,消除的时候在栈顶就直接放到栈里,在栈底就放在最后一个空栈里。
的时候,可能出现 个栈都放了两个元素,但是下一个元素不存在于任何栈中的情况。无论是将这个元素放在最后一个栈,或是任意一个已经放了两个元素的栈中,都可能导致无法消除。
假设一个有两个元素的栈,栈底为 ,栈顶为 ,观察到,如果将这最后一个元素 放在这个栈上面,若在牌堆中下一个 出现的比下一个 早,那么其实不会有任何的影响。因为利用最后一个空栈将 消除后,又会变为原来的情况。
如果所有栈都不满足下一个 出现的比下一个 早,那么只需要将 放在那个空栈中,然后把 个 中在牌堆中最早出现的那一个所在的栈设为新的空栈即可。因为这一个 一定可以通过操作 来消除。
需要注意的是,当一个栈被定义为“空栈”的时候,无论那个栈是否还存在元素,都不可以往里面再添加元素,直到下一次特殊情况出现。否则可能导致因为加入新的元素,这个栈底无法通过操作 来消除。
实现的话我比较无脑,直接维护 个 ,分别储存 有 个元素(注意不等价于上文的“空栈”,那个“空栈”是用来处理特殊情况的空栈) 个元素 个元素且 先于 个元素且 后于 的栈的编号。注意“空栈”需要特殊记下来。
时间复杂度 。
3|0代码
__EOF__

本文链接:https://www.cnblogs.com/stoorz/p/16943135.html
关于博主:菜死了 /fad
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2021-12-01 【洛谷P3579】PAN-Solar Panels
2020-12-01 【洛谷P3261】城池攻占
2020-12-01 【YbtOJ#20236】红点蓝点
2020-12-01 【YbtOJ#20235】公共序列