CCF-CSP 201703-2学生排队 一维数组满分题解

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;
}
上一篇:CCF: 2021 12-1 序列查询


下一篇:CCF认证 2019-9 小明种苹果