CSP思路,201703-2学生排队

思路拆解:

1、首先定义一个stunum数组,存放初始及每一次变化后的学生学号,利用for循环二元数组输入指令数据。

2、紧接着遍历寻找指令中的学号与初始队列中学号相同的同学,找到让他出队,然后当p>0时往后移动,在这里我考虑的是每次都和相邻同学换位,一共需要换p次,就可以达到插入的效果,换完一次后j++,(意思是:例如第一次循环是第二名和第三名换,j++之后就是第三名和第四名换)。当p<0时,代码类似,需要j--。

3、当将第一条指令执行完毕后,利用之前博客提到新学会的goto函数,跳出循环,一如既往的好用这个函数!跳到只剩最外层循环的位置,紧接着执行第二条指令,以此遍历。

4、利用for循环简单输出stunum。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,m,arr[1001][3];
int stunum[1001];//表示初始学号数组 
int main(){
    cin>>n>>m;
    int k=1;
    for(int i=1;i<=n;i++){
        stunum[i]=k;
        k++;
    }
    for(int i=1;i<=m;i++){
        for(int j=1;j<=2;j++){
            cin>>arr[i][j];//输入指令 
        }
    }
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            if(arr[i][1]==stunum[j]){//首先根据学号找到需要出队的学生 
            for(int k=1;k<=abs(arr[i][2]);k++){//需要相邻交换arr[i][2]次  
                if(arr[i][2]>0){
                    int temp=stunum[j];
                 stunum[j]=stunum[j+1];
                 stunum[j+1]=temp;
                 j++;
                }
                 if(arr[i][2]<0){
                    int temp=stunum[j];
                 stunum[j]=stunum[j-1];
                 stunum[j-1]=temp;
                 j--;
                } 
            }
            goto out;//前往标识符,跳出循环 
        }    
    }
    out:;
}
for(int i=1;i<=n;i++){
    cout<<stunum[i]<<" ";
}
}

  • 48
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值