题目
分析
思路:
①数组中,node记录学生的id和位置,目前数组的下标+1=学生id;
②通过计算改变学生的位置数值weizhi;
③按着位置数值weizhi排序,最后按着顺序输出学生id。
本来是想用数组模拟过程的,写的过程中就发现太复杂了,也觉得不可能这么智障地解题;
写着写着突然产生了这个思路,欸,觉得这个方法不错,挺简单的,感觉略略巧妙hhhhh。
代码
#include<bits/stdc++.h>
using namespace std;
struct node {
int id;//每个学生的id
int weizhi;//学生所处的位置
};
bool cmp(node l,node r) {//按着位置前后排序
return l.weizhi <r.weizhi ;
}
int main() {
int n,m;
cin>>n>>m;
node a[n];
for(int i=0; i<n; i++) {
a[i].id=a[i].weizhi =i+1;
}
while(m--) {
int id,move;
cin>>id>>move;
for(int i=0; i<n; i++) {
if(move>0) {//学生后移 那么该学生后面move个学生就得前移,位置编号-1
if(a[i].weizhi<=a[id-1].weizhi +move and a[i].weizhi >a[id-1].weizhi )
a[i].weizhi --;
} else {//学生前移 那么该学生前面move个学生就得前移,位置编号+1
if(a[i].weizhi>=a[id-1].weizhi+move and a[i].weizhi<a[id-1].weizhi)
a[i].weizhi++;
}
}
a[id-1].weizhi+=move;//该学生的自己位置的移动
}
sort(a,a+n,cmp);//排序
for(int i=0; i<n; i++)//输出
cout<<a[i].id <<" ";
}