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日

相关文章

  • 浅谈iOS开发中static变量的三大作用

    浅谈iOS开发中static变量的三大作用 在iOS开发中,static变量是一种特殊类型的变量,它具有以下三个主要作用: 1. 保持数据的持久性 static变量在函数内部声明,但其生命周期超过了函数的执行周期。这意味着,当函数执行完毕后,static变量的值仍然保持不变,直到下一次函数调用时才会被更新。这种持久性使得static变量非常适合用于存储需要在…

    other 2023年7月29日
    00
  • Java super和this的对比及使用

    Java中的super和this是两个重要的关键字,在面向对象编程中常用于访问父类的属性和方法以及当前实例的属性和方法。本攻略将围绕这两个关键字详细讲解其对比和使用方法。 一、super和this的区别 1.1 定义 super:关键字表示当前类的父类对象。 this:关键字表示当前对象本身。 1.2 用法 super:可以使用”super.”的方式调用父类…

    other 2023年6月27日
    00
  • 详解git基本操作和指令

    详解Git基本操作和指令攻略 Git是一种分布式版本控制系统,用于跟踪文件的变化并协同开发。本攻略将详细介绍Git的基本操作和指令,帮助您快速上手使用Git。 1. 初始化Git仓库 在开始使用Git之前,需要先初始化一个Git仓库。可以通过以下命令在当前目录下初始化一个新的Git仓库: git init 2. 添加和提交文件 在Git中,需要将文件添加到暂…

    other 2023年8月3日
    00
  • ASP创建对象的两种方法比较

    以下是使用标准的Markdown格式文本,详细讲解ASP创建对象的两种方法比较的完整攻略: ASP创建对象的两种方法比较 在ASP中,我们可以使用两种方法来创建对象:使用CreateObject函数和使用Server.CreateObject方法。这两种方法都可以用于创建COM组件、ActiveX对象和ASP组件。 1. 使用CreateObject函数 C…

    other 2023年10月14日
    00
  • Windows量身定做的登录管理工具

    Windows量身定做的登录管理工具 Windows系统提供了许多登录管理工具,使得用户可以方便地管理登录设置。本文将详细介绍这些工具的功能和使用方法,包括: 本地用户和组管理器 计算机管理控制台 控制面板中的用户账户 本地用户和组管理器 本地用户和组管理器是一个强大的Windows管理工具,可以用来查看和修改本地计算机上的用户和组设置。它可以通过下列步骤打…

    other 2023年6月25日
    00
  • 浅谈Pycharm的项目文件名是红色的原因及解决方式

    浅谈Pycharm的项目文件名是红色的原因及解决方式 原因 在Pycharm中,项目文件名变红的原因是因为这些文件在VCS(Git、Svn、Mercurial 等版本控制系统)中被标记为 deleted(已删除的)文件或者是未被加入版本控制中的文件。 如果是deleted文件,说明该文件在VCS中被删除了,但是在本地文件系统中还存在,所以文件名会变成红色。 …

    other 2023年6月26日
    00
  • mysqlin排序

    以下是“MySQL中排序”的完整攻略: MySQL中排序 在MySQL中,您可以使用ORDER BY子句对查询结果进行排序。本攻略将介绍如何使用ORDER BY子句对查询结果进行排序。 步骤1:使用ORDER BY子句 ORDER BY子句用于对结果进行排序。以下是ORDER BY子句的语法: SELECT column1, column2, … FRO…

    other 2023年5月7日
    00
  • 雷达无线电系列(一)几种常见的幅度分布函数(matlab)

    下面是关于float的完整攻略,包括介绍、使用和两个示例说明。 介绍 float是一种Python中的数据类型,用于表示浮点数。浮点数是一种带有小数点的数值,可以表示实数。在Python中,可以使用float类型来存储和处理浮点数。 使用 定义float变量: 在Python中,可以使用赋值语句定义float变量,例如: a = 1.23 b = 4.56 …

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