OJ 11、Olympic Game
描述:
每次奥运会期间,大家都非常关注奖牌榜排名的情况。
现在我们假设奖牌榜的排名规则,按优先级从高到低如下:
1、金牌 数量多的排在前面;
2、银牌 数量多的排在前面;
3、铜牌 数量多的排在前面;
4、若以上三个条件仍无法区分名次,则以国家名称的字典序排列。
我们假设国家名称不超过20个字符、各种奖牌数不超过100,且大于等于0。
题目类别: 字符串,排序
难度: 中级
分数:
运行时间限制: 无限制
内存限制: 无限制
阶段: 应聘考试
输入:
第一行输入一个整数N(0<N<21),代表国家数量;
然后接下来的N行,每行包含一个字符串Namei表示每个国家的名称,和三个整数Gi、Si、Bi
分别表示每个获得的金、银、铜牌的数量,以空格隔开,如(China 51 20 21)。
具体见Sample Input。
输出:
输出奖牌榜的依次顺序,只输出国家名称,各占一行,具体见Sample Output。
样例输入:
5
China 32 28 34
England 12 34 22
France 23 33 2
Japan 12 34 25
Rusia 23 43 0
样例输出:
China
Rusia
France
Japan
England
代码实现:
import java.util.*;
class Country {
String name;
int gold, silver, bronze;
public Country(String name, int gold, int silver, int bronze) {
this.name = name;
this.gold = gold;
this.silver = silver;
this.bronze = bronze;
}
}
public class OlympicGame {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
List<Country> medalists = new ArrayList<>();
for (int i = 0; i < N; i++) {
String name = scanner.next();
int gold = scanner.nextInt();
int silver = scanner.nextInt();
int bronze = scanner.nextInt();
medalists.add(new Country(name, gold, silver, bronze));
}
// 排序
medalists.sort((c1, c2) -> {
if (c1.gold != c2.gold) {
return Integer.compare(c2.gold, c1.gold);
} else if (c1.silver != c2.silver) {
return Integer.compare(c2.silver, c1.silver);
} else if (c1.bronze != c2.bronze) {
return Integer.compare(c2.bronze, c1.bronze);
} else {
return c1.name.compareTo(c2.name);
}
});
// 输出
for (Country country : medalists) {
System.out.println(country.name);
}
}
}
这个Java程序通过创建一个 Country
类来存储每个国家的信息,然后使用 List
存储所有国家。排序时使用了一个自定义的比较器,按照金牌、银牌、铜牌数量降序排列,如果仍然相同则按国家名称的字典序升序排列。最后,遍历排序后的列表,并输出排好序的国家名称。