codeforces 704A (队列模拟) Thor

Codeforces 704A (队列模拟) Thor

Codeforces是一家知名程式竞赛网站,每周都会有各种比赛和练习赛。在这些比赛中,大部分的题目都是需要用程序解决的算法问题。其中一道经典的题目就是Codeforces 704A (队列模拟) Thor。本文将详细介绍这道经典的算法题目。

题目描述

Codeforces 704A (队列模拟) Thor 的题目描述如下:

Thor 有一个队列,其中一些元素是显示在屏幕上的。每个元素可以被清除,这样将从队列的开头移除元素之后它就会从屏幕上消失。现在,和队列一起用于控制显示的元素的是一列表情。如果 Thor 要增加一个显示元素,则它必须是列表情之一。如果他想清除一个屏幕上的元素,那么它必须是列表情之一。没错,列表情就是本题关键的点。

注意到在一个元素从队列的开头被移除,屏幕上相应的元素也会消失。

你需要用程序模拟这些操作。也就是说,你需要维护这个队列和它上面的显示元素,能够处理以下两种操作之一:

  • get 保证队首是显示在屏幕上的元素。将它从队列中移除,并且从屏幕上消失。
  • put x 把 x 加入到队列的末尾。如果 x 存在于列表情中,就把它插入在屏幕上;否则不会插入。

你需要编写一个程序,读入一个列表情的字符串(就像题目描述中),并能够处理以上两种操作,输出程序不断操作后最后队列的状态。

输入格式

输入一个列表情的字符串,由若干个整数和字母 'p','g' 组成。

输出格式

按 // get p get 输出程序不断操作后最后队列的状态。 的形式输出调用 get 操作后,因为顺序而可能会从屏幕上删除的元素,以及仍然在队列中的元素。如果没有元素在屏幕上的,那么输出字符串 "-"。元素之间的顺序不能被改变。在输出队列中的元素之前,请不要忘记在行末添加换行符。

样例输入

3
put 1
put 2
g
g
g
put 3
put 4

样例输出

1
-
2

解题思路

我们可以用一个双端队列 deque 表示维护队列在尾部加入和头部弹出。同时用一个集合 pset 维护当前屏幕上显示的元素,便于快速判断一个元素是否在屏幕上。

具体实现时,遇到 put 操作,我们首先判断插入的元素是否为列表情中的元素,若是,则将其插入到队列尾部,并在集合 pset 中插入该元素;若否,则只将元素插入到队列尾部。

遇到 get 操作时,我们直接从队列头部弹出元素,并在集合 pset 中删除该元素。

注意:这里的队列操作是 FIFO 先进去的元素先被弹出,而选 【需要被清理(get 操作)的元素】 是 【队列开头】 的元素,因此无论从哪个数据结构中弹出需要被清理的元素都应该是队列开头的元素。

最后输出队列中的剩余元素以及当前屏幕上显示的元素即可。

代码实现详见下方

代码实现

import collections

n = int(input())
pset = set()
dq = collections.deque()
for i in range(n):
    line = input().split()
    if line[0] == 'put':
        dq.append(line[1])
        if line[1].isdigit():
            pset.add(int(line[1]))
    else:
        if not dq: # 如果队列为空,输出 -
            print('-')
        else:
            x = dq.popleft()
            if int(x) in pset: # 如果弹出的元素在屏幕上,就从集合中删除
                pset.remove(int(x))
    if pset: # 如果有元素在屏幕上,输出第一个元素
        print(pset.pop())
    else: # 如果没有元素在屏幕上,输出 -
        print('-')

总结

Codeforces 704A (队列模拟) Thor 是一道经典的算法题目,通过这道题目的练习,我们不仅可以学习队列和集合等数据结构的使用,还可以提高自己的编程技能。希望本文能帮助大家更好地了解这道经典算法题目。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:codeforces 704A (队列模拟) Thor - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • MyBatis延迟加载与立即加载案例教程

    Mybatis延迟加载与立即加载案例教程 Mybatis是一款优秀的Java持久层框架,其中对于对象关系映射的实现有立即加载和延迟加载两种方式。在使用Mybatis的过程中,我们需要根据实际情况来选择延迟加载或者立即加载。本教程将会为大家介绍Mybatis中延迟加载与立即加载的应用。 1. 立即加载 列出Student表格的每一条记录,并返回相关信息: SE…

    other 2023年6月25日
    00
  • Win10怎么设置WinX菜单? 自定义WinX菜单的方法

    我来为你详细讲解Win10设置WinX菜单以及自定义WinX菜单的方法。 一、WinX菜单是什么 WinX菜单是Win10系统中的一个快捷菜单,它可以通过快捷键Win+X或者鼠标右键单击开始菜单上的开始按钮打开。WinX菜单提供了一些常用的操作和快捷方式,比如打开电源选项、控制面板等等,用户也可以对WinX菜单进行自定义,以添加自己经常使用的程序或文件。 二…

    other 2023年6月25日
    00
  • 打造安全的Windows 2003服务器

    打造安全的Windows 2003服务器攻略 一、更新操作系统 安装最新的Windows 2003更新补丁,确保操作系统不会存在已知的安全漏洞。 安装或启用防火墙,防止未经授权的访问。 二、加强账户安全 设置强密码策略,要求密码长度、复杂度等。 关闭或删除不必要的默认账户,例如管理员、Guest账户。 禁用未使用的服务、端口、共享和组策略。 三、加强网络安全…

    other 2023年6月27日
    00
  • 电脑禁用迅雷插件后谷歌浏览器还是会自动默认迅雷下载如何处理

    以下是“电脑禁用迅雷插件后谷歌浏览器还是会自动默认迅雷下载如何处理”的完整攻略: 电脑禁用迅雷插件后谷歌浏览器还是会自动默认迅雷下载如何处理 在使用谷歌浏览器下载文件时,有时会出现默认使用迅雷下载的情况。即使我们已经禁用了迅雷插件,谷歌浏览器仍然会自动使用迅雷下载。本攻略将详细讲解如何处理这种情况。 方法一:更改下载设置 我们可以通过更改谷歌浏览器的下载设置…

    other 2023年5月8日
    00
  • 一文总结C++运算符的使用方法

    一文总结C++运算符的使用方法 C++是一种功能强大的编程语言,提供了丰富的运算符来进行各种操作。本文将详细介绍C++中常用的运算符及其使用方法,并提供两个示例说明。 算术运算符 C++提供了一组算术运算符,用于执行基本的数学运算。以下是常用的算术运算符及其使用方法: 加法运算符(+):用于将两个数相加。例如:int result = 5 + 3;,结果为8…

    other 2023年8月21日
    00
  • windows无法初始化这个硬件的设备驱动程序(错误代码37)的解决办法

    解决”Windows无法初始化这个硬件的设备驱动程序(错误代码37)” 如果设备管理器中出现了“Windows无法初始化这个硬件的设备驱动程序(错误代码37)”的提示,说明驱动程序有问题,需要进行一系列的操作来解决问题。 步骤一:卸载问题发生的设备 首先,我们需要在设备管理器中找到可能引起问题的设备,并进行卸载。操作步骤如下: 打开“设备管理器”(可以通过搜…

    other 2023年6月20日
    00
  • 街头霸王5无法点击同意协议进不去游戏的解决方法

    对于”街头霸王5无法点击同意协议进不去游戏”的问题,常见解决方法如下: 1. 清除缓存和数据 一般情况下,无法点击同意协议进入游戏的问题是由于缓存或数据损坏所致。清除缓存和数据可以解决这个问题。 在手机设置中找到应用程序对应的选项,找到”街头霸王5″应用并进入,点击”存储”选项,选择”清除缓存”和”清除数据”。 示例1:若你使用的是华为手机,打开手机设置,滑…

    other 2023年6月27日
    00
  • 全面解析Bootstrap表单使用方法(表单控件)

    全面解析Bootstrap表单使用方法(表单控件) 什么是Bootstrap表单控件? Bootstrap表单控件是Bootstrap框架的一部分,它提供了一套预定义的、可重用的表单样式和布局,可以方便地构建各种类型的表单。 Bootstrap表单控件的结构 Bootstrap表单控件通常由以下元素组成: 表单标签(<form>元素) 表单组(&…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部