https://blog.csdn.net/tigerisland45/article/details/66477733
/* CCF201703-2 学生排队 */
#include <stdio.h>
#define N 1000
int pos2sno[N+1]; // 位置上的学号
int find(int sno)
{
int i;
for(i = 1; pos2sno[i] != sno; i++);
return i;
}
int main(void)
{
int n, m, p, q, i, j;
// 读入数据
scanf("%d%d", &n, &m);
// 初始化
for(i=1; i<=n; i++)
pos2sno[i] = i;// 1 2 3 4 5 6 7 8
// 模拟移动过程 m=3
// 数组pos2sno[]用于存储各个所在的位置上的学生(学号),pos2sno[i]=s表示学生s位于位置i。
for(i=1; i<=m; i++) {
scanf("%d%d", &p, &q); //p=3 q=2
int pos = find(p);//p=3 pos=3
if(q > 0) {
for(j=pos; j<pos+q; j++) //j=3 j<3+2=5 j++
pos2sno[j] = pos2sno[j + 1]; //pos[3]=pos[4]
pos2sno[pos + q] = p;
} else {
for(j=pos; j>pos+q; j--)
pos2sno[j] = pos2sno[j - 1];
pos2sno[pos + q] = p;
}
}
// 输出结果
for(i=1; i<=n; i++)
printf("%d ", pos2sno[i]);
printf("\n");
return 0;
}
STL LIST
/* CCF201703-2 学生排队 */
#include <iostream>
#include <algorithm>
#include <list>
using namespace std;
int main()
{
int n, m, p, q;
list<int> l;
// 读入数据
cin >> n >> m;
// 初始化
for(int i=1; i<=n; i++)
l.push_back(i);
// 模拟移动过程
for(int i=1; i<=m; i++) {
cin >> p >> q;
list<int>::iterator iter = find(l.begin(), l.end(), p);
list<int>::iterator iter2 = iter;
if(q > 0)
for(int i=0; i<=q; i++)
iter2++;
else
for(int i=1; i<=-q; i++)
iter2--;
l.insert(iter2, p);
l.erase(iter);
}
// 输出结果
list<int>::iterator iter = l.begin();
cout << *iter;
for(iter++; iter != l.end(); iter++)
cout << " " << *iter;
cout << endl;
return 0;