74 学生选拔

74 学生选拔

作者: Turbo时间限制: 1S章节: 结构体

问题描述 :

多组测试数据。每组数据的第一行的数字n,m(1≤m,n≤1000)。n表示该班级有n个同学,m表示要选取每门课排名前m的学生。

以下n行每行由一个名字,一个语文成绩,一个数学成绩,一个英语成绩组成,表示一个同学的信息。

名字是一个由大小写字母组成的字符串,名字字符串最长长度为20,名字中间没有空格。每门课成绩是一个0到10000之间的整数。

数据保证,在同一组测试数据中,任意两个同学同一门课程的分数一定不相同。

说明:总共三门课,每门课录取前m个学生,则总共最多录取3m个学生,但这些学生可能重复,即某个学生的两门课甚至三门课成绩都排在前m个,这样,录取的学生数将少于3m。

输入说明 :

输入多组测试数据。

每组数据的第一行为两个数字n,m(1≤m,n≤1000),以空格分隔。

以下n行每行由一个名字,一个语文成绩,一个数学成绩,一个英语成绩组成。名字是一个由大小写字母组成的字符串,名字字符串最长长度为20,名字中间没有空格。每门课成绩是一个0到10000之间的整数。数据之间以空格分隔。

输出说明 :

按字典顺序输出被录取的学生名字。每行一个。每组数据之后(包括最后一组数据)输出一个空行。

输入范例 :

8 2
Peter 60 80 30
Alice 100 90 80
Date 50 20 90
Bob 30 50 70
Mongo 40 100 40
Sally 70 70 60
Clever 10 40 20
Water 20 60 100
1 1
Kimmy 0 0 0
3 2
AAA 80 80 80
A 100 100 100
AA 90 90 90

输出范例 :

Alice
Date
Mongo
Sally
Water

Kimmy

A
AA

import java.util.*;

public class test_74 {
    /**
     * 74 学生选拔
     */
    public static void main(String[] args) {
        ArrayList<Student> students = new ArrayList<>();
        Set<String> ans = new TreeSet<String>();
        Scanner sc = new Scanner(System.in);
        int n, m = 0;
        String[] split;
        while (sc.hasNext()) {
            if(m!=0){
                System.out.println();
            }
            split = sc.nextLine().trim().split(" ");
            n = Integer.valueOf(split[0].trim());
            m = Integer.valueOf(split[1].trim());
            for (int i = 0; i < n; i++) {
                split = sc.nextLine().trim().replace("  "," ").split(" ");
                Student student = new Student(split[0].trim(), Integer.valueOf(split[1].trim()), Integer.valueOf(split[2].trim()), Integer.valueOf(split[3].trim()));
                students.add(student);
            }
            //语文降序
            students.sort(Comparator.comparing(Student::getY).reversed());
            for (int i = 0; i < m; i++) {
                if (!ans.contains(students.get(i).getName())) {
                    ans.add(students.get(i).getName());
                }
            }
            //数学降序
            students.sort(Comparator.comparing(Student::getS).reversed());
            for (int i = 0; i < m; i++) {
                if (!ans.contains(students.get(i).getName())) {
                    ans.add(students.get(i).getName());
                }
            }
            //英语降序
            students.sort(Comparator.comparing(Student::getE).reversed());
            for (int i = 0; i < m; i++) {
                if (!ans.contains(students.get(i).getName())) {
                    ans.add(students.get(i).getName());
                }
            }
            Iterator<String> iterator = ans.iterator();
            while (iterator.hasNext()) {
                System.out.println(iterator.next());
                iterator.remove();
            }
            ans.clear();
            students.clear();
        }
    }

    public static class Student {
        private String name;
        private int y;
        private int s;
        private int e;

        public Student() {
        }

        public Student(String name, int y, int s, int e) {
            this.name = name;
            this.y = y;
            this.s = s;
            this.e = e;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getY() {
            return y;
        }

        public void setY(int y) {
            this.y = y;
        }

        public int getS() {
            return s;
        }

        public void setS(int s) {
            this.s = s;
        }

        public int getE() {
            return e;
        }

        public void setE(int e) {
            this.e = e;
        }
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值