HDU 2093 考试排名
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);
}
}
}