排队算法:模拟学生排队过程并输出最终队列

本算法模拟了老师将学生排成一列的场景,学生按照指定规则依次入列,并可以从队列中移除。算法接收学生数量、入列规则和移除学生的信息,最终输出队列中所有学生的编号。

算法描述

  1. 初始化: 老师将编号为 1 的同学安排进队列,此时队列中只有他一个人。
  2. 入列: 编号为 i 的同学入列的方式为:
    • 老师指定编号为 x 的同学站在编号为 y 的同学的左边或右边。
    • 如果 y 为 0,则表示将 i 号同学插入到 x 号同学的左边;
    • 如果 y 为 1,则表示插入到右边。
  3. 移除: 老师会从队列中移除若干个同学,移除的同学编号依次输入,如果该同学已经不在队列中则忽略该指令。

输入格式

第一行一个整数 n,表示了有 n 个同学。

第 i 行,第 i 行包含两个整数 x,y,其中 x 为小于 i 的正整数,y 为 0 或者 1。若 y 为 0,则表示将 i 号同学插入到 x 号同学的左边,y 为 1 则表示插入到右边。

第 n+1 行为一个整数 m,表示去掉的同学数目。

接下来 m 行,每行一个正整数 k,表示将 k 号同学从队列中移去,如果 k 号同学已经不在队列中则忽略这一条指令。

输出格式

一行,包含最多 n 个空格隔开的整数,表示了队列从左到右所有同学的编号。

样例输入

4
1 0
2 1
1 0
2
3
3

样例输出

2 4 1

C++代码

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> queue;
    queue.push_back(1);

    for (int i = 0; i < n; i++) {
        int x, y;
        cin >> x >> y;
        vector<int>::iterator it;

        if (y == 0) {
            it = find(queue.begin(), queue.end(), x);
            queue.insert(it, i + 2);
        } else {
            it = find(queue.begin(), queue.end(), x);
            queue.insert(it + 1, i + 2);
        }
    }

    int m;
    cin >> m;

    for (int i = 0; i < m; i++) {
        int x;
        cin >> x;
        vector<int>::iterator it = find(queue.begin(), queue.end(), x);

        if (it != queue.end()) {
            queue.erase(it);
        }
    }

    for (int i = 0; i < queue.size(); i++) {
        cout << queue[i] << ' ';
    }

    return 0;
}
排队算法:模拟学生排队过程并输出最终队列

原文地址: http://www.cveoy.top/t/topic/bAjQ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录