# 排队2## 题目描述现在有 $n$ 个小朋友编号依次为 $1 2 cdots n$要排队一开始他们各自为一队接下来老师会发布 $m$ $le 1000$条命令每条命令给出两个同学的编号 $i j a$表示让 $j$ 同学以及他后面 $a$ 个同学保持原来的顺序不变一起排到 $i$ 同学后面。如果 $j$ 同学后面不足 $a$ 个学生则让 $j$ 同学以及他后面的所有同学保持原来的顺序不变一起排
#include <iostream>
#include <vector>
using namespace std;
int main() {
// 读入数据
int n, m;
cin >> n >> m;
// 初始化队伍,每个同学独立为一队
vector<vector<int>> teams(n);
for (int i = 0; i < n; i++) {
teams[i].push_back(i+1);
}
// 执行命令
for (int i = 0; i < m; i++) {
int x, y, a;
cin >> x >> y >> a;
// 找到队伍中的位置
int x_idx, y_idx;
for (int j = 0; j < teams.size(); j++) {
if (teams[j][0] == x) {
x_idx = j;
}
if (teams[j][0] == y) {
y_idx = j;
}
}
// 将y同学及其后面的a个同学从y的队伍中分离出来
vector<int> temp;
for (int j = 0; j <= a && j < teams[y_idx].size() - 1; j++) {
temp.push_back(teams[y_idx].back());
teams[y_idx].pop_back();
}
// 将temp中的同学插入到x的队伍中
for (int j = temp.size() - 1; j >= 0; j--) {
teams[x_idx].push_back(temp[j]);
}
}
// 输出结果
cout << teams.size() << endl;
for (int i = 0; i < teams.size(); i++) {
for (int j = 0; j < teams[i].size(); j++) {
cout << teams[i][j] << " ";
}
cout << endl;
}
return 0;
}
``
原文地址: http://www.cveoy.top/t/topic/iSGW 著作权归作者所有。请勿转载和采集!