首页 > 其他分享 >小X与队列

小X与队列

时间:2024-08-15 22:26:34浏览次数:9  
标签:输出 cnt 队列 queue int 指令 ans

题目

题目描述
  小X正和同学们做列队的练习。

  有\(n\)名同学排成一路纵队,编号为i的同学排在从前往后数第i个位置上,即:初始时的队列为\(1, 2, 3, ..., n\)。

  接下来小X会发出若干条指令,每条指令形如“请编号为x的同学排到最前面来”。(例如:若当前时刻的队列为\(5, 4, 3, 2, 1\),发出一条\(x\)=2的指令后,队列变成了\(2, 5, 4, 3, 1\)。)

  小X发出了很多很多指令,同学们晕头转向不知道该怎么排列。于是就请你算一算,执行完这些指令后,队列应该变成什么样?

输入

从文件 queue.in 中读入数据。

第一行两个用空格隔开的正整数\(n\)和\(m\),分别表示人数和指令数。

第二行\(m\)个用空格隔开的正整数x[i],按顺序表示每次指令的\(x\)值。

输出

输出到文件 queue.out 中。

输出仅有一行包含\(n\)个正整数,相邻两个数之间用一个空格隔开,表示执行完所有指令后的队列。

样例输入

4 3

2 3 2

样例输出
2 3 1 4

数据范围限制

对于30%的数据,\(1<=n,m<=1000\)

对于另外30%的数据,\(n=m\),且\(1~n\)每个数在x[i]中恰好出现一次。

对于100%的数据,1<=\(n\),\(m\)<=100000

提示
样例解释
  第一条指令前:1 2 3 4

  第一条指令后(\(x\)=2):2 1 3 4

  第二条指令后(\(x\)=3):3 2 1 4

  第三条指令后(\(x\)=2):2 3 1 4


题解:

首先,我们知道,\(x\)[ ]的最后一个一定是输出时排在最前面的,所以,我们可以反向遍历\(x\)[ ],然后把他们存到\(ans\)[ ]里面

就像这样:

for (int i = m; i >= 1; i--) {
      ans[++cnt] = a[i];
 }

但是,你又会发现,同一个数会被输出两次

就像样例中的:2 3 22就会被输出两次,于是,我们就需要去重:

for (int i = m; i >= 1; i--) {
	if (!b[a[i]]) {
		ans[++cnt] = a[i];
		b[a[i]] = 1;
	}
}

最后没有被调整过的数就原顺序输出即可
代码:

#include <bits/stdc++.h>
using namespace std;
int n, m;
int a[100005];
int b[100005];
int ans[100005];
int cnt = 0;
int main()
{
    freopen("queue.in", "r", stdin);
    freopen("queue.out", "w", stdout);
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
        cin >> a[i];
    for (int i = m; i >= 1; i--) {
        if (!b[a[i]]) {
            ans[++cnt] = a[i];
            b[a[i]] = 1;
        }
    }
    for (int i = 1; i <= n; i++) {
        if (!b[i])
            ans[++cnt] = i;
    }
    for (int i = 1; i <= n; i++) {
        cout << ans[i] << " ";
    }
    return 0;
}

标签:输出,cnt,队列,queue,int,指令,ans
From: https://www.cnblogs.com/ACyming/p/18361922

相关文章

  • Python中堆、栈、队列之间的区别
    一、队列概念1、队列是只有一端可以进行插入操作,而另一端可以进行删除操作的有序线性存储结构,满足先进先出的约束。2、在计算机科学中,队列是一个集合,其中集合中的实体按顺序保存,集合上的主要(或唯一)操作是向后端位置添加实体,称为入队,前端位置并删除实体,称为出队。这使得队列成为......
  • 高性能无锁队列 Disruptor 核心原理分析及其在i主题业务中的应用
    一、i主题及Disruptor简介i主题是vivo旗下的一款主题商店app,用户可以通过下载主题、壁纸、字体等,实现对手机界面风格的一键更换和自定义。Disruptor是英国外汇交易公司LMAX开发的一个高性能的内存队列(用于系统内部线程间传递消息,不同于RocketMQ、Kafka这种分布式消息......
  • 高性能无锁队列 Disruptor 核心原理分析及其在i主题业务中的应用
    作者:来自vivo互联网服务器团队-LiWanghong本文首先介绍了Disruptor高性能内存队列的基本概念、使用Demo、高性能原理及源码分析,最后通过两个例子介绍了Disruptor在i主题业务中的应用。一、i主题及Disruptor简介i主题是vivo旗下的一款主题商店app,用户可以通过下......
  • 恶补基础知识:Java 栈与队列详解
    @目录前言简介栈Java实现栈的示例代码:栈的主要应用场景包括:队列Java实现队列的示例代码:LinkedList中的add方法和offer方法的区别队列主要应用场景:总结前言请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、提示:以下是本篇文章正文内容,下面案例可供参考简介使用Java实......
  • 假设Sigmund Landers在商业街设置了一个提供建议的摊位,顾客可以购买1分钟,2分钟,或3分钟
    /假设SigmundLanders在商业街设置了一个提供建议的摊位,顾客可以购买1分钟,2分钟,或3分钟的建议,为确保交通每个摊位前排队等待的顾客最多10人,用两个队列模拟两个摊位/#include<stdio.h>#include<stdlib.h>#defineMAX_SIZE10typedefstruct{intitems[MAX_SIZE];......
  • 如何保证数据不丢失?(死信队列)
    死信队列1、什么是死信死信通常是消息在特定的场景下表现:消息被拒绝访问消费者发生异常,超过重试次数消息的Expiration过期时间过长或者队列TTL过期时间消息队列到达最大容量maxLength2、什么是死信队列用来存储死信的队列,并且队列中只由死信构成的消息队列是死信队列......
  • RabbitMQ消息队列
    消息队列概念什么是消息队列消息(Message)是指在应用间传送的数据消息队列(MessageQueue)是一种应用间的通信方式解决方法,确保消息的可靠传递、主流消息队列目前主流的几大消息1队列有:RabitMQ、ActiveMQ、RocketMQ、Kafka、ZeroMQ等,也有一些小众的比如Beanstalk、当然我......
  • RabbitMQ消息队列
    一:RabbitMQ介绍RabbitMQ是一款在全球范围内使用非常广泛的开源消息队列中间件。它轻量级、易部署、并支持多种协议。它基于Erlang开发,天生拥有高并发的能力。1:RabbitMQ相关术语(1)生产者产生消息的进程或服务(2)消费者接收消息的进程或服务(3)队列RabbitMQ是消息队列中间件,而......
  • 代码随想录day29 || 134 加油站,135 分糖果,860 柠檬水找零,406 根据身高重建队列
    加油站funccanCompleteCircuit(gas[]int,cost[]int)int{ //思路,首先统计一个差值数组,表示行驶到下一个加油站可以补充的油量,然后加总差值数组, //如果小于0,表示从起始位置到目前为止剩余油量小于0,不足以跑完全程,同时将起始位置放到遍历的下一个位置 iflen(gas)==0......
  • 参加阿里云云消息队列 RabbitMQ 版动手操作,赠送博客园T恤
    这是8月份园子和阿里云的第3期推广合作,招募100人参加云消息队列RabbitMQ版动手操作,有效完成动手操作的前100人赠送1件原价79元的博客园T恤,如果不需要T恤,也可以选原价不高于79元的其他周边。活动官网:https://developer.aliyun.com/special/yunduanwendao/rabbitmq01参与步骤:1......