CSP-201703-2-学生排队
解题思路
-
初始化队列:通过输入获得学生的数量
n
,然后创建一个队列queue
,初始时这个队列中的学生按照学号从小到大的顺序排列。这是通过循环赋值实现的,其中每个学生的学号是其在列表中的位置加1。 -
处理调整指令:
- 接着,程序读入另一个整数
m
,表示将要执行的调整次数。 - 对于每次调整,程序读入两个整数
p
和q
。其中p
是需要调整位置的学生的学号,而q
表示移动的距离和方向:如果q
为正,学生向后移动;如果q
为负,学生向前移动。
- 接着,程序读入另一个整数
-
执行移动:
- 对于每一次调整,程序首先找到该学生当前在队列中的位置(即找到一个位置
j
使得queue[j] == p
)。 - 然后,根据
q
的正负判断移动的方向和距离,并进行相应的操作:- 如果
q
是正数,表示学生向后移动,那么程序会将学生p
插入到目标位置(即当前位置加上移动距离后的位置)。之后,原来的位置上的学生被移除。 - 如果
q
是负数,表示学生向前移动,那么程序会在更前面的位置插入学生p
,然后移除原来的位置上的学生。
- 如果
- 对于每一次调整,程序首先找到该学生当前在队列中的位置(即找到一个位置
-
输出最终队列:最后,程序遍历最终的队列,并打印出每个学生的学号,作为最终的排列顺序。
完整代码
#include <iostream>
#include <vector>
using namespace std;int n,m, p, q, target;int main() {cin >> n >> m;vector<int>queue(n);for (size_t i = 0; i < n; i++){queue[i] = i + 1;}for (size_t i = 0; i < m; i++){cin >> p >> q;for (size_t j = 0; j < n; j++){if (queue[j] == p) {target = j;break;}}if (q > 0){queue.insert(queue.begin() + target + q + 1, p);queue.erase(queue.begin() + target);}else{queue.insert(queue.begin() + target + q, p);queue.erase(queue.begin() + target + 1);}}for (auto& it : queue) {cout << it << " ";}return 0;
}