CSP-201703-2-学生排队
解题思路
-
初始化队列: 初始时,学生按照学号从小到大顺序排队,即学号1的学生在最前面,学号n的学生在最后面。使用一个向量(vector)
myQueue
来模拟这个队列,初始填充为1, 2, …, n。 -
读取输入: 读取学生总数
n
和调整次数m
。对于每一次调整,读取两个整数p
和q
,其中p
表示要调整的学生的学号,q
表示移动的距离,正值代表向后移动,负值代表向前移动。 -
队伍操作: 对于每一次调整,遍历队列找到学号为
p
的学生。然后根据q
的值进行操作:- 向后移动(
q > 0
): 在当前位置加上移动距离后的位置插入学号为p
的学生,然后删除原来位置上的该学生。 - 向前移动(
q < 0
): 在当前位置减去移动距离的位置插入学号为p
的学生,然后删除原来位置上的该学生。
在实现移动时,要特别注意数组下标与学生位置之间的关系,以及向量中元素的插入和删除操作。
- 向后移动(
完整代码
#include <iostream>
#include <vector>
using namespace std;int n, m, p, q;int main() {cin >> n >> m;// 初始化队列vector<int>myQueue(n);for (int i = 1; i <= myQueue.size(); i++){myQueue[i - 1] = i;}// 队伍操作for (int i = 0; i < m; i++){cin >> p >> q;for (int j = 0; j < myQueue.size(); j++){if (myQueue[j] == p) // 找到要移动的同学{if (q > 0){myQueue.insert(myQueue.begin() + j + q + 1, p);myQueue.erase(myQueue.begin() + j);}else if (q < 0){myQueue.insert(myQueue.begin() + j + q, p);myQueue.erase(myQueue.begin() + j + 1);}break;}}}for (auto& it : myQueue){cout << it << " ";}return 0;
}