题目来源于CCFCSP
思路分析
巧妙运用C++ STL即可简便的解决问题。
- 使用
vector
进行数据的存储。 - 然后使用
find
函数进行数字位置的查找 - 根据找到的位置和q的正负值,决定两种插入方式,因为
inset
函数每次插入在所给的位置之前。 - 然后再删除之前旧的值所在的位置的元素即可。
代码分析
//201703-2 学生排队
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> num;
int main()
{
int n; //人数
cin >> n;
int m; //次数
cin >> m;
//学号对应
for (int i = 1; i <= n; ++i)
num.push_back(i);
int p,q;
for (int i = 1; i <= m; ++i) {
cin >> p >> q;
vector<int>::iterator it = find(num.begin(), num.end(), p);
if (q > 0) {
num.insert(it + q + 1, p);
num.erase(it);
}
else {
num.insert(it + q, p);
auto it_2 = find(num.rbegin(), num.rend(),p);
num.erase((++it_2).base());
}
}
for (auto it : num)
cout << it << " ";
return 0;
}
测试结果