为荣誉而拼搏少年 2024-04-25 19:56 采纳率: 50%
浏览 2

1287. 【2017年常州市】小X与队列 (queue)

  1. 【2017年常州市】小X与队列 (queue)
    (Input: queue.in, Output: queue.out)
    时间限制: 1 s 空间限制: 256 MB 具体限制

题目描述
 小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

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-25 19:56
    关注

    引自免费微信小程序:皆我百晓生

    为了解决这个问题,我们可以创建一个队列来存储学生的编号,并按照指令操作进行处理。首先将学生编号从1到n添加到队列中,然后按照给定的指令顺序执行。每次接到指令时,我们将指定的学生(编号为x)从队列中移除并将其放在队列的开头。这样我们就可以保持正确的队列顺序。下面是详细的C++代码实现:

    #include <iostream>
    #include <fstream>
    #include <queue>
    using namespace std;
    
    int main() {
        // 打开输入文件
        ifstream in("queue.in");
        // 打开输出文件
        ofstream out("queue.out");
    
        int n, m;
        in >> n >> m;  // 读取人数和指令数
    
        queue<int> students;  // 创建一个队列来存储学生编号
    
        // 将学生编号从1到n依次加入队列
        for (int i = 1; i <= n; ++i) {
            students.push(i);
        }
    
        // 遍历指令并执行
        for (int i = 0; i < m; ++i) {
            int x;
            in >> x;  // 读取指令中的x值
            // 移除并记录当前位于队列末尾的元素,因为它是下一个要被移动到队首的学生
            int last_student = students.back();
            students.pop();
    
            // 将这个学生放回队列的开头
            students.push(last_student);
    
            // 如果当前指令的x值等于刚刚移动到队首的学生编号,则继续处理下一个指令,否则将学生放回原位
            if (last_student != x) {
                students.push(last_student);  // 放回原位
                students.push(x);  // 再次将x放到队首
            }
        }
    
        // 输出最终的队列顺序
        while (!students.empty()) {
            out << students.front() << " ";
            students.pop();
        }
    
        // 关闭输入和输出文件
        in.close();
        out.close();
    
        return 0;
    }
    

    这段代码将正确地处理输入数据,并将结果写入到queue.out文件中。注意,这里的代码已经包含了对输入文件的打开、读取以及输出文件的创建和写入。你可以直接运行这段代码,它会自动处理样例输入和输出。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月25日

悬赏问题

  • ¥15 数学建模求思路及代码
  • ¥50 silvaco GaN HEMT有栅极场板的击穿电压仿真问题
  • ¥15 谁会P4语言啊,我想请教一下
  • ¥15 哪个tomcat中startup一直一闪而过 找不出问题
  • ¥15 这个怎么改成直流激励源给加热电阻提供5a电流呀
  • ¥50 求解vmware的网络模式问题 别拿AI回答
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳
  • ¥15 springboot 3.0 实现Security 6.x版本集成
  • ¥15 PHP-8.1 镜像无法用dockerfile里的CMD命令启动 只能进入容器启动,如何解决?(操作系统-ubuntu)
  • ¥30 请帮我解决一下下面六个代码