数据结构与算法

HDU 2093 考试排名

2021-12-01  本文已影响0人  itbird01

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);
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读