ccf201703-2学生排队

本文介绍了一个关于学生队列调整的算法问题,体育老师需要按照特定的调整指令,如向后或向前移动指定的学生,来重新排列初始按学号顺序排队的学生。通过使用数组作为数据结构,文章详细阐述了如何通过移动数组元素来实现学生位置的调整。
问题描述
  体育老师小明要将自己班上的学生按顺序排队。他首先让学生按学号从小到大的顺序排成一排,学号小的排在前面,然后进行多次调整。一次调整小明可能让一位同学出队,
向前或者向后移动一段距离后再插入队列。   例如,下面给出了一组移动的例子,例子中学生的人数为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 QueueStudent {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();//学生数量
        int adjustCount = sc.nextInt();//调整次数
        int [] queue = new int[count];
        for (int i = 0; i< count; i++){
            queue[i] = i+1;//初始情况
        }
        for(int i = 0; i<adjustCount; i++){
            int adElement = sc.nextInt();//移动的元素
            int moveCount = sc.nextInt();//移动的步数
            for(int j = 0; j< queue.length; j++){
                if(queue[j] == adElement){
                    if(moveCount > 0){
                        //向后移动,从移动位置开始,将后面的元素逐个前移,然后将移动的元素放在结束位置
                        for(int k= j; k< j+ moveCount; k++){
                            queue[k] = queue[k+1];
                        }
                        queue[j+moveCount] = adElement;
                    }else{
                        //向前移动,从移动位置开始,将前面元素逐个后移,然后将移动的元素放在结束位置
                        for(int k= j; k> j+ moveCount; k--){
                            queue[k] = queue[k-1];
                        }
                        queue[j+moveCount] = adElement;
                    }
                    break;
                }
            }
        }
        for (int i = 0; i < queue.length; i++) {
            System.out.print(queue[i]+" ");
        }
    }
}

 

转载于:https://www.cnblogs.com/syq816/p/10071307.html

实现功能  计算平均值Avg:包括每门课程的平均值,和每个学生所有课程的平均值。  计算最高分Max:包括每门课程的最高分,和学生平均分的最高分,并给出最高分对应的学生和学号。  计算最低分Min:包括每门课程的最低分,和学生平均分的最低分,并给出最低分对应的学生和学号。  计算每门课程成绩不及格(<60分)以及优秀(大于90分)的学生个数Count。  计算每门课程的标准方差Variance。  查询功能Query:可以根据输入的学生或者学号,查询该学生的所有课程的成绩。  排序功能Sort:按照从高到低的顺序,对每门课程的成绩进行排序,对学生平均分进行排序,并给出排序后成绩所对应的学生和学号。 实现功能  计算平均值Avg:包括每门课程的平均值,和每个学生所有课程的平均值。  计算最高分Max:包括每门课程的最高分,和学生平均分的最高分,并给出最高分对应的学生和学号。  计算最低分Min:包括每门课程的最低分,和学生平均分的最低分,并给出最低分对应的学生和学号。  计算每门课程成绩不及格(<60分)以及优秀(大于90分)的学生个数Count。  计算每门课程的标准方差Variance。  查询功能Query:可以根据输入的学生或者学号,查询该学生的所有课程的成绩。  排序功能Sort:按照从高到低的顺序,对每门课程的成绩进行排序,对学生平均分进行排序,并给出排序后成绩所对应的学生和学号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值