试题编号: | 201703-2 |
试题名称: | 学生排队 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 体育老师小明要将自己班上的学生按顺序排队。他首先让学生按学号从小到大的顺序排成一排,学号小的排在前面,然后进行多次调整。一次调整小明可能让一位同学出队,向前或者向后移动一段距离后再插入队列。 输入格式 输入的第一行包含一个整数n,表示学生的数量,学生的学号由1到n编号。 输出格式 输出一行,包含n个整数,相邻两个整数之间由一个空格分隔,表示最终从前向后所有学生的学号。 样例输入 8 样例输出 1 2 4 3 5 8 6 7 评测用例规模与约定 对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ m ≤ 1000,所有移动均合法。 |
思路:模拟, pos[i]=k,k是学号,i是位置
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int dir[4][2]= {1,0,0,1,-1,0,0,-1};
const double eps = 1e-6;
const int INF=0x3f3f3f3f;
const int MOD=1e9+7;
const int N = 1e3+5;
int pos[N];///pos[i]=k,k是学号,i是位置
void forward_remove(int l,int r) {
for(int i=0; i<r; i++) {
pos[l+i]=pos[l+i+1];
}
}
void backward_remove(int l,int r) {
for(int i=0; i<r; i++) {
pos[l-i]=pos[l-i-1];
}
}
int main() {
int n,m;
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++) pos[i]=i+1;
for(int i=0; i<m; i++) {
int p,q,tmp;
scanf("%d%d",&p,&q);
for(int k=0; k<n; k++) {
if(pos[k]==p) {
int tmp;
if(q>0) { ///后移
tmp=pos[k];
forward_remove(k,q);
pos[k+q]=tmp;
break;
} else {///前移
tmp=pos[k];
backward_remove(k,-q);
pos[k+q]=tmp;
break;
}
}
}
// for(int i=1; i<=n; i++) {
// if(i!=1) printf(" ");
// printf("%d",pos[i]);
// }
// puts("");
}
for(int i=0; i<n; i++) {
if(i) printf(" ");
printf("%d",pos[i]);
}
puts("");
return 0;
}
/**
8
3
3 2
8 -3
3 -2
*/