排队算法:模拟学生排队过程并输出最终队列
排队算法:模拟学生排队过程并输出最终队列
本算法模拟了老师将学生排成一列的场景,学生按照指定规则依次入列,并可以从队列中移除。算法接收学生数量、入列规则和移除学生的信息,最终输出队列中所有学生的编号。
算法描述
- 初始化: 老师将编号为 1 的同学安排进队列,此时队列中只有他一个人。
- 入列: 编号为 i 的同学入列的方式为:
- 老师指定编号为 x 的同学站在编号为 y 的同学的左边或右边。
- 如果 y 为 0,则表示将 i 号同学插入到 x 号同学的左边;
- 如果 y 为 1,则表示插入到右边。
- 移除: 老师会从队列中移除若干个同学,移除的同学编号依次输入,如果该同学已经不在队列中则忽略该指令。
输入格式
第一行一个整数 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 著作权归作者所有。请勿转载和采集!