算法提高 特等奖学金 java

算法提高 特等奖学金
问题描述~
这所大学有n名学生,
他们中的每个人都会在m门必修课的每门课上获得一个百分制的整数成绩(0-100),
从中挑选出最优秀的k位学生,并给他们颁发奖学金。
某个学生只要有一门课不及格(分数<85),他就丧失了获得奖学金的资格。
教务长会给所有科目按照重要性排序,在所有拥有获得奖学金资格的学生中,教务长更喜欢在更重要的科目中取得高分的学生,
并依此将学生排序(即对于某两名学生,在最重要的科目中取得更高分的学生排在前面;
如果两人在最重要的科目中取得相同的分数,则比较次重要的科目;若再相同则比较第三重要的科目……一直下去)。
  以前土豪大学的学生数量并不多,教务长就用纸笔计算谁将获得奖学金;今年大学扩招了,教务长意识到用纸笔计算太复杂了,
你能帮他解决这个问题吗?说不定教务长高兴了就给你也发一份奖学金(⊙o⊙)哦!(注意:获奖学生数量可能小于k)

输入格式~
  输入数据第一行为三个整数n、m、k,用空格隔开;
第二行至第(n+1)行是学号分别为1、2……n的同学的m门课的成绩(m门课已按重要性排序),
用空格隔开(输入保证每两人的分数不完全相同)。
输出格式~
  输出一行为获奖同学的学号,按排名从前到后排序,用空格隔开。
样例输入
10 2 7
99 87
96 79
93 99
88 88
90 87
90 86
90 88
88 90
91 100
100 85
样例输出~
10 1 3 9 7 5 6
数据规模和约定~
  0<n≤1000,0<m≤100,0<k≤n

提炼;	
	 学生:n名   (属性:编号num及成绩grade[])
    必修课:m门 
最大获奖人数:k人
筛选方式:
		a:从第一门必修课开始比较成绩,如果成绩相同则比较下一门,即( 分数越高越优先,必修课的优先级越高,越优先。)且优先前k名。			
		b:如果有一门成绩不及格(<85),取消获取奖学金资格。
		
注意:有奖学金资格的人数可能会小于k。

思路:
需要要比较学生这个对象,则需要自定义一个学生的类。(成绩应该用一个int数组存储)
既然要按照学生成绩比较对象,进而想到需要继承Comparable,重写compareTo方法。因此:如何重写compareTo方法 就是问题的关键。
之后,对数据初始化。用list存储每一个对象,并用collections.sort(list)进行模拟筛选。
输出 前 min(k,list.length)名学生的编号

import java.util.*;

public  class Main {
	//m为静态变量
    static  int m; 
    //定义内部类 继承Comparable
    public static class student implements Comparable{
        int num ;
        int[] grade ;
	
        public student(int num,int[] grade){
            this.num=num;
            this.grade=grade;
        }
        //重写compareTo方法,调用compare方法
        @Override
        public int compareTo(Object o) {
            student student = (student) o;
            return compare(this.grade, student.grade);
        }
        
        public  int compare(int[] x, int[] y){
       //比较 第i门成绩 不相等则返回相应的1/-1,相等则进入下一次循环
            for (int i=1;i<=m;i++){
                if (x[i]-y[i]>0){
                    return -1;
                }else if (x[i]-y[i]<0){
                    return 1;
                }
            }
            //为了不报错的废话
            return  0;
        }
		//重写toString方法
        @Override
        public String toString() {
                return  num +" ";
        }
    }
    
    public static void main(String[] args) {
        Scanner scanner =new Scanner(System.in);
        //初始化 n,m,k
        int n =scanner.nextInt();		//人数
        m=scanner.nextInt();				//学科数
        int k=scanner.nextInt();			//最大获奖人数
        List<student> list =new ArrayList();
        int num=0;            //学生的编号 
        //初始化学生属性
  		b: for (int i=0;i<n;i++){
            int[] grade = new int[m+1];
            num++;    //保证学生的编号正确
           for (int j=1;j<=m;j++){
                grade[j]=scanner.nextInt(); //保证先输出完,再判断是否有资格
            }
           for (int j=1;j<=m;j++){
           //不及格者不存入list
               if (grade[j]<85){
                continue  b;
                }
           }
            list.add(new student(num,grade));
        }
        //筛选
        Collections.sort(list);
        //输出结果
        for (int i=0;i<Math.min(k, list.size());i++){
            System.out.print(list.get(i)+" ");
        }
    }
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值