关于CF-2275B思路及题解
本题就是一个常见的模拟题,## 题目大意
有 n 份文档,编号 (1,2,\dots,n),依次执行 n 条操作,字符串 s 的第 i 位对应第 i 号文档的操作:
'1':将当前文档编号放入栈中;'2':打印栈顶文档;栈为空时,直接打印当前文档;'3':直接打印当前文档。
打印过的文档只需要标记一次。
输出两个内容:
- 没有被打印的文档数量;
- 按从小到大顺序输出所有未打印的文档编号。
我的解题思路
一开始看到操作1是存入容器,操作2取出最近放进去的元素,第一反应是栈(后进先出)。
但是我换了一个实现方式:用双端队列 deque 模拟栈。
原理:栈是尾部存入、尾部取出;如果用 deque 的头部存入、头部取出,弹出顺序和栈完全一致,效果等价。
整体流程:
- 多组测试用例循环处理。
- 开一个双端队列,用来存放待打印的文档编号。
- 开标记容器,记录文档是否已经打印,同时统计已经打印的文档总数。
- 按顺序遍历每一份文档(编号 i,对应字符串
s[i-1]):- 如果操作是
'1':把当前文档编号插入双端队列头部; - 如果操作是
'2':- 队列不为空:取出队首元素。如果该文档还没打印,标记为已打印,打印计数 + 1;然后弹出队首。
- 队列为空:直接打印当前文档,未打印则标记、计数 + 1。
- 如果操作是
'3':直接打印当前文档,未打印则标记、计数 + 1。
- 如果操作是
- 总文档数减去已打印数量,得到未打印文档的个数。
- 输出未打印数量,从小到大遍历编号,输出所有没有被标记打印的文档。
代码如下:
![image]()

浙公网安备 33010602011771号