CCF——学生排队(2017-3)


问题描述

  体育老师小明要将自己班上的学生按顺序排队。他首先让学生按学号从小到大的顺序排成一排,学号小的排在前面,然后进行多次调整。一次调整小明可能让一位同学出队,向前或者向后移动一段距离后再插入队列。
  例如,下面给出了一组移动的例子,例子中学生的人数为8人。
  0)初始队列中学生的学号依次为1, 2, 3, 4, 5, 6, 7, 8;
  1)第一次调整,命令为“3号同学向后移动2”,表示3号同学出队,向后移动2名同学的距离,再插入到队列中,新队列中学生的学号依次为1, 2, 4, 5, 3, 6, 7, 8;
  2)第二次调整,命令为“8号同学向前移动3”,表示8号同学出队,向前移动3名同学的距离,再插入到队列中,新队列中学生的学号依次为1, 2, 4, 5, 8, 3, 6, 7;
  3)第三次调整,命令为“3号同学向前移动2”,表示3号同学出队,向前移动2名同学的距离,再插入到队列中,新队列中学生的学号依次为1, 2, 4, 3, 5, 8, 6, 7。
  小明记录了所有调整的过程,请问,最终从前向后所有学生的学号依次是多少?
  请特别注意,上述移动过程中所涉及的号码指的是学号,而不是在队伍中的位置。在向后移动时,移动的距离不超过对应同学后面的人数,如果向后移动的距离正好等于对应同学后面的人数则该同学会移动到队列的最后面。在向前移动时,移动的距离不超过对应同学前面的人数,如果向前移动的距离正好等于对应同学前面的人数则该同学会移动到队列的最前面。

输入格式

  输入的第一行包含一个整数n,表示学生的数量,学生的学号由1到n编号。
  第二行包含一个整数m,表示调整的次数。
  接下来m行,每行两个整数p, q,如果q为正,表示学号为p的同学向后移动q,如果q为负,表示学号为p的同学向前移动-q。

输出格式

  输出一行,包含n个整数,相邻两个整数之间由一个空格分隔,表示最终从前向后所有学生的学号。

样例输入

8
3
3 2
8 -3
3 -2

样例输出

1 2 4 3 5 8 6 7

评测用例规模与约定

  对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ m ≤ 1000,所有移动均合法。

说明:首先将此人的学号临时保存起来,然后判断此人是前移还是后移,接下来我们就可以按照题目要求,移动此人前面或者后面的人了,最后将此人插入到对应位置。我这里多加了一个功能,如果移动步数大于此人身后的学生数量,则将此人移到队尾,同理前移也是。

import java.util.Scanner;

public class 学生排队 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();

        int[] stu = new int[n];
        for (int i = 0; i < n; i++) { // 初始化学生序列
            stu[i] = i + 1;
        }

        for (int i = 0; i < m; i++) {
            int p = sc.nextInt();
            int q = sc.nextInt();
            // 找到对应学生
            for (int j = 0; j < n; j++) {
                if (stu[j] == p) {
                    // 判断是向前移动还是向后移动
                    int temp = stu[j]; // 保存要移动的学生的学号
                    int pos = j;
                    int x = 0;
                    if (q > 0) {    //后移
                        if (q > n - pos - 1) {
                            q = n - pos - 1;
                        }
                        while (x < q) {    //我这里是多加的功能,如果移动步数大于此人身后的位置数量,则移到队尾,同理前移也是
                            stu[pos] = stu[pos + 1];
                            x++;
                            pos++;
                        }
                    } else if (q < 0) {    //前移
                        if (q < -pos) {
                            q = -pos;
                        }
                        while (x > q) {
                            stu[pos] = stu[pos - 1];
                            x--;
                            pos--;
                        }
                    }
                    stu[pos] = temp;
                    break;
                }
            }
        }

        // 移动完成后,输出最终序列
        for (int y = 0; y < n; y++) { // 初始化学生序列
            System.out.print(stu[y] + " ");
        }

        sc.close();
    }
}

原文地址:https://www.cnblogs.com/tangxlblog/p/9998285.html

时间: 2024-11-09 00:50:20

CCF——学生排队(2017-3)的相关文章

CCF学生排队

这题如果考虑考虑用数组折腾会非常麻烦,如果想到用vector的insert函数和erase函数就会非常舒服的模拟出来.vt.erase(it)之后it就变成了野指针,所以要用it=erase(it),这样it就会自动指向下一个元素. #include<cstdio> #include<iostream> #include<vector> #include<algorithm> #include<string.h> using namespace

CCF - 201703-2 - 学生排队

问题描述 试题编号:    201703-2试题名称:    学生排队时间限制:    1.0s内存限制:    256.0MB问题描述: 体育老师小明要将自己班上的学生按顺序排队.他首先让学生按学号从小到大的顺序排成一排,学号小的排在前面,然后进行多次调整.一次调整小明可能让一位同学出队,向前或者向后移动一段距离后再插入队列. 例如,下面给出了一组移动的例子,例子中学生的人数为8人. 0)初始队列中学生的学号依次为1, 2, 3, 4, 5, 6, 7, 8: 1)第一次调整,命令为"3号同学

[CCF 201703-2 学生排队] VS2019使用erase时的问题

#include <iostream> #include <vector>#inclde <algorithm> using namespace std; int main() { int n, t; vector<int> que; cin >> n >> t; for (int i = 0; i < n; i++) { que.push_back(i+1); } for (int i = 0; i < t; i++)

CCF 20170302 学生排队

#include<iostream> #include<vector> #include<algorithm> using namespace std; const int N = 1000; vector<int> v(N); int main(){ int n, m; cin>>n>>m; for(int i = 0; i < n; i++){ v[i] = i + 1; } int p,q; for(int i = 0;

CCF签到汇总(JAVA版本,2013-12~2018-12)

CCF签到题,没有提到分数的题目都是100分,不然会额外提出,样例输入都单独文本复制粘贴了,这样你们测试的时候很方便粘贴用例,不用自己手敲,都是一些签到题.但有好的基础,会多的数据结构,好的数学思想,那么这些都是一些很简单的问题.因为java版本不多,所以仅供参考,以下代码的思路都很简单,很多都直接通过题目面向过程,有更好的想法,或者你我有些题没有满分的改进方式都可以交流. CCF300分的线,1.2题需要拿满,最低也要190,第三题是理解题,很多时候考你的语文能力更多,第四题是规律性更强的题,

Codeforces Round #247 (Div. 2) ABC

Codeforces Round #247 (Div. 2) http://codeforces.com/contest/431 代码均已投放:https://github.com/illuz/WayToACM/tree/master/CodeForces/431 A - Black Square 题目地址 题意: Jury玩别踩白块,游戏中有四个区域,Jury点每个区域要消耗ai的卡路里,给出踩白块的序列,问要消耗多少卡路里. 分析: 模拟水题.. 代码: /* * Author: illuz

栈和队列的总结

栈和队列的总结: (有时候感觉自己掌握了,栈和队列,可是在写的时候会遇到不同的情况,就不会处理了,因此在这里进行总结下). 栈: 栈是一端受限,一段允许进行操作的线性表.我自己理解时,会将它理解成一个装书的盒子.放书,取书,就是进行的操作.这个的特点就是,你放了一踏书,现在你想取书,你只能先把上面的书一个个取出来,即:先放的后取,后放的先取.放在栈上说,就是先进后出. 明白了栈的定义,现在要实际的实际,首先是它的逻辑结构:线性表.它是线性的. 现在是它的存储结构:最常采用的是顺序存储和链式存储(

从通讯聊计算机

导问 给你导线若干,以及一个小灯泡,你能否让计算机将其点亮? 通讯中如何保障数据的位的丢失? (本文技术主要还是几年前做的,细节之处所记之处可能不甚准确) 文 对于接口, 不同系统不同平台有不同接口,不同的虚拟方式,我们先以RS232举例,由于硬件参数相同,无论Linux还是Windows这块是一致的. 对于RS232程序者来说,往往只关心数据,因此往往只关注2,3口.(其实有的做硬件也他么的只接了235,具体定义可以去查寻MSDN文档或者RS232定义) 众所周知这个参数非常显眼——频率,为什

软考软件设计师到底难不难?

软考全称计算机技术与软件专业技术资格水平考试,是由国家人力资源和社会保障部(原人事部).工业和信息化部(原信息产业部)领导的国家级考试,其目的是,科学.公正地对全国计算机与软件专业技术人员进行职业资格.专业技术资格认定和专业技术水平测试.该考试分为 5 个专业类别,并在各专业类别中分设了高.中.初级专业资格考试,囊括了共 28 个资格的考核.通过考试获得证书的人员,表明其已具备从事相应专业岗位工作的水平和能力,用人单位可根据工作需要从获得证书的人员中择优聘任相应专业技术职务. 先介绍下我自己,我