CCF-CSP 201703-2学生排队 一维数组满分题解
题目链接:201703-2学生排队
思路:
1. 用一维数组的下标代表排队的位置,一维数组对应的值为学生的学号;
2. 定义一个find函数,利用find函数找到a同学对应的位置;
3. 若b>0,则先将a同学后的b位同学向前移动一个单位,由于是顺序整体移动,则直接采用后一个同学位置覆盖前一个同学的位置的方法,即p[i-1]=p[i],最后再移动a同学的位置。
4. 若b<0,则先将a同学前的b位同学向后移动一个单位,由于是顺序整体移动,则直接采用前一个同学位置覆盖后一个同学的位置的方法,即p[i+1]=p[i],最后再移动a同学的位置。
具体代码:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int n,m;
int p[N];
//用来找到a同学的位置
int find(int a)
{
int t=0;
for(int i=1;i<=n;i++)
{
if(p[i]==a)
t=i;
}
return t;;
}
void move(int a,int b)
{
int t=find(a);//找到a同学的位置
//将a同学后的b位同学向前移动一个单位
if(b>0)
{
for(int i=t+1;i<=t+b;i++)
{
p[i-1]=p[i];
}
p[t+b]=a;//将a同学向后移动b个单位
}
//将a同学前的b位同学向后移动一个单位
if(b<0)
{
for(int i=t-1;i>=t+b;i--)
{
p[i+1]=p[i];
}
p[t+b]=a;//将a同学向前移动b个单位
}
}
int main()
{
cin>>n>>m;
int a,b;
for(int i=1;i<=n;i++)p[i]=i;//初始化
for(int i=1;i<=m;i++)
{
cin>>a>>b;
move(a,b);
}
for(int i=1;i<=n;i++)
cout<<p[i]<<" ";
cout<<endl;
return 0;
}