试题 算法提高 成绩排名
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
小明刚经过了一次数学考试,老师由于忙碌忘记排名了,于是老师把这个光荣的任务交给了小明,小明则找到了聪明的你,希望你能帮他解决这个问题。
输入格式
第一行包含一个正整数N,表示有个人参加了考试。接下来N行,每行有一个字符串和一个正整数,分别表示人名和对应的成绩,用一个空格分隔。
输出格式
输出一共有N行,每行一个字符串,第i行的字符串表示成绩从高到低排在第i位的人的名字,若分数一样则按人名的字典序顺序从小到大。
样例输入
3
aaa 47
bbb 90
ccc 70
样例输出
bbb
ccc
aaa 【数据规模和约定】
人数<=100,分数<=100,人名仅包含小写字母。
【思路:】
创建一个Student类,进行自定义的排序即可。值得注意的是,由于蓝桥杯算法每次只能提交一个Main类,所以Student类必须以内部类的形式创建于Main类之中。
代码:
package exercise1;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
public class Main implements Comparator<Object>{
public static Scanner sc = new Scanner(System.in);
public static List<Student> list = new ArrayList<Student>();
/**
* 定义内部类
* @author aas48
*
*/
static class Student{
public int score;
public String name;
}
public static void main(String[] args) {
int n = sc.nextInt();
for(int i = 1;i <= n;i++) {
String name = sc.next();
int score = sc.nextInt();
Student s = new Student();
s.score = score;
s.name = name;
list.add(s);
}
Collections.sort(list, new Main());
for(Student s : list) {
System.out.println(s.name);
}
}
@Override
public int compare(Object o1, Object o2) {
Student s1 = (Student)o1;
Student s2 = (Student)o2;
if(s1.score < s2.score) {
return 1;
}else if(s1.score > s2.score){
return -1;
}
//分数一样的情况。需要按照名字的首字母排序
if(s1.name.compareTo(s2.name) > 0) {
return 1;
}else if(s1.name.compareTo(s2.name) < 0) {
return -1;
}
return 0;
}
}
如果分数一样,则对同学的名字进行字典排序从小到大的输出。
java中可以直接使用String的compareTo方法。比如A.compareTo(B)
如果值>0,就说明,A的字典序大于B,应该放到后面去。