HDU 2093 考试排名

作者: itbird01 | 来源:发表于2021-12-01 07:04 被阅读0次

    HDU 2093 考试排名

    题意:C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点。它的功能是怎么实现的呢?我们做好了题目的解答,提交之后,要么“AC”,要么错误,不管怎样错法,总是给你记上一笔,表明你曾经有过一次错误提交,因而当你一旦提交该题“AC”后,就要与你算一算帐了,总共该题错误提交了几回。虽然你在题数上,大步地跃上了一个台阶,但是在耗时上要摊上你共花去的时间。特别是,曾经有过的错误提交,每次都要摊上一定的单位时间分。这样一来,你在做出的题数上,可能领先别人很多,但是,在做出同样题数的人群中,你可能会在耗时上处于排名的劣势。

    解题思路

    1.首先觉得,这个题的输入上,需要理解清楚,题目中并未说明总共有多少学生,什么时候输入结束,所以我们暂时以scanner.hasNext()作为结束判断条件
    2.分析输入数据,分别处理输入的每题的答题结果,分析题意可知,输入有四种,0、负数、整数(整数)、整数,首先我们分别分析这四种输入的记分方法,0和负数不用管,因为没有通过AC,所以我们只需计数后面的两种情况即可
    3.处理整数的情况,借助Integer.parseInt如果转换抛出异常,则代表输入是带有()的
    4.输出格式化,可以重写toString方法,实现对象的输出格式化,这里巧妙借用了 String.format("%-ds", name)特性

    解题遇到的问题

    1.理解题意,对输入输出做分析
    2.用到了String.format("%-ds", name)特性,有无负号,代表是左对齐还是右对齐,d代表补位多少
    3.用Collections.sort(List<T> list, Comparator<? super T> c)实现了题目中要求的排序

    后续需要总结学习的知识点

    1.Java出现No enclosing instance of type Main is accessible. Must qualify the allocation with an enclosing instance of type Main (e.g. x.new A() where x is an instance of Main)

    ##解法
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            int n = scanner.nextInt();
            int m = scanner.nextInt();
            // 首先觉得,这个题的输入上,需要理解清楚,题目中虽未说明总共有多少学生,什么时候输入结束,但是题目中提到了实时提交系统,也就是说,可以根据输入的学生和做题情况,做实时排名
            ArrayList<Student> students = new ArrayList<Student>();
            while (scanner.hasNext()) {
                Student st = new Student(scanner.next());
                // 分别处理输入的每题的答题结果,分析题意可知,输入有四种,0、负数、整数(整数)、整数
                // 首先我们分别分析这四种输入的记分方法,0和负数不用管,因为没有通过AC
                // 所以我们只需计数后面的两种情况即可
                int score = 0;
                int index = 0;
                for (int i = 0; i < n; i++) {
                    int temp = getScoreByInput(scanner.next(), m);
                    if (temp != 0) {
                        index++;
                    }
                    score += temp;
                }
                st.setScore(score);
                st.setSize(index);
                students.add(st);
            }
            Collections.sort(students, new Comparator<Student>() {
    
                @Override
                public int compare(Main.Student o1, Main.Student o2) {
                    if (o1.size == o2.size) {
                        if (o1.score == o2.score) {
                            return o1.name.compareTo(o2.name);
                        } else {
                            return o1.score - o2.score;
                        }
                    } else {
                        return o2.size - o1.size;
                    }
                }
            });
            for (Student student : students) {
                System.out.println(student.toString());
            }
            scanner.close();
        }
    
        public static int getScoreByInput(String input, int m) {
            try {
                // 处理整数的情况,借助Integer.parseInt如果转换抛出异常,则代表输入是带有()的
                int score = Integer.parseInt(input);
                if (score <= 0) {
                    return 0;
                } else {
                    return score;
                }
            } catch (Exception e) {
                int temp = Integer.parseInt(input.substring(0, input.indexOf("(")));
                int temp1 = Integer.parseInt(input.substring(input.indexOf("(") + 1,
                        input.indexOf(")")));
                return temp + temp1 * m;
            }
        }
        public static class Student {
            String name;
            int size;
            int score;
    
            public int getSize() {
                return size;
            }
            public void setSize(int size) {
                this.size = size;
            }
            public int getScore() {
                return score;
            }
            public void setScore(int score) {
                this.score = score;
            }
            public Student() {
            }
            public Student(String name) {
                this.name = name;
            }
    
            @Override
            public String toString() {
                // 每个学生占一行,输出名字(10个字符宽),做出的题数(2个字符宽,右对齐)和时间分(4个字符宽,右对齐)。名字、题数和时间分相互之间有一个空格
                // 输出总共是18个字符
                return String.format("%-10s", name) + " "
                        + String.format("%2s", size) + " "
                        + String.format("%4s", score);
            }
        }
    }
    

    相关文章

      网友评论

        本文标题:HDU 2093 考试排名

        本文链接:https://www.haomeiwen.com/subject/rfywtrtx.html