题目
大学生足协决定举办全国性的大学生足球赛,由每个学校派遣一支队伍代表该校参赛。比赛分区分为几个赛区进行,最终的总决赛中,将有不超过n支队伍参加。经过激烈的角逐,有机会参与总决赛的队伍已经决出。
协会对比赛的规则进行了调整,以便使得比赛更具有观赏性。
总决赛的参赛队伍为n支,n为偶数;
进入前1/2的队伍才有资格进入淘汰赛;
队伍按积分排名,具体规则为:胜一场积3分;平一场积1分;负一场积0分。队伍首先按积分降序排列,积分相同按净胜球数降序排列,仍然相同的按进球数降序排列。
基于上述规则,尚未出现有排名歧义的情况发生。
随着赛程的进行,目前各个队伍对战的结果已经确定了,小B负责确定进入淘汰赛的名单,她向你求助,你能帮她吗?
输入
测试数据有多组,每组测试数据的第一行为一个整数n(1=< n <=50),为参与总决赛的球队数,随后的n行为球队的名字,由不超过30个的大小写拉丁字母构成。
随后的n*(n-1)/2行为赛事的开展情况,每行的格式为name1-name2 num1:num2,表示两支队伍的比分情况(1< num1< num2 <100)。
确保不会有两支队伍同名,也不会出现队伍自己通自己比赛的情况,且每场比赛仅出现一次。
输出
对每组测试数据,输出n/2行,为按字母序排列的进入淘汰赛的n/2支队伍的名单,每个名字在单独的行中输出。
样例输入
4
A
B
C
D
A-B 1:1
A-C 2:2
A-D 1:0
B-C 1:0
B-D 0:3
C-D 0:3
2
a
A
a-A 2:1
样例输出
A
D
a
代码
package com.iflytek.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;
public class BallGame {
public void process(Map<String, Integer>nameScores,List<String>scoreList){
//根据符号把结果的字符串切割,并且把球队得分相加
for(int i=0;i<scoreList.size();i++){
String[] splits = scoreList.get(i).split(" ");
String[] names = splits[0]. split("-");
String[] scores = splits[1].split(":");
for(int j=0;j<2;j++){
nameScores.replace(names[j], nameScores.get(names[j])+Integer.parseInt(scores[j]));
}
}
Integer[] scores = new Integer[nameScores.size()];
System.out.println("每个球队的得分是:");
Set<String> nameSet = nameScores.keySet();
int i=0;
for(String name:nameSet){
int score = nameScores.get(name);
scores[i++]= score;
System.out.println(name+"\t"+score);
}
System.out.println("进入总决赛的球队是:");
//使用Arrays将scores进行降序排序,并且使用lambda创建一个匿名的降序Comparator
Arrays.sort(scores,(o1,o2)->{
return o2.compareTo(o1);
});
// 这是按照高分降序输出球队的方法,不符合题目的按照字母升序输出
// for(int j=0;j<scores.length/2;j++){
// for(String name:nameSet){
// if(nameScores.get(name).equals(scores[j])){
// System.out.println(name);
// }
// }
// }
for(String name:nameSet){
for(int j=0;j<scores.length/2;j++){
//依据字母升序依次遍历球赛的名字是否获得进入决赛的分数,
//可获得按照字母升序输出球队决赛的结果
if(nameScores.get(name).equals(scores[j])){
System.out.println(name);
break;
}
}
}
}
public static void main(String[] args) {
Scanner in= new Scanner(System.in);
System.out.println("请输入球队数量:");
int number = Integer.parseInt(in.nextLine());
System.out.println("请输入"+number+"个球队的名字:");
//TreeSet会根据key的字母进行升序排序,方便后续根据字母升序输出决赛球队
Map<String, Integer> nameScores = new TreeMap<String, Integer>();
for(int i=0;i<number;i++){
String name = in.nextLine();
nameScores.put(name, 0);
}
System.out.println("请输入所有球队比赛的结果:");
System.out.println("格式为:name1-name2 score1:score2");
List<String> scoreList = new ArrayList<>();
for(int i=0;i<(number*(number-1)/2);i++){
String result = in.nextLine();
scoreList.add(result);
}
in.close();
BallGame ballGame = new BallGame();
ballGame.process(nameScores, scoreList);
}
}
运行结果
请输入球队数量:
4
请输入4个球队的名字: //乱序输入字母,后面也会按照字母升序输出
B
A
D
C
请输入所有球队比赛的结果:
格式为:name1-name2 score1:score2
A-B 1:1
A-C 2:2
A-D 1:0
B-C 1:0
B-D 0:3
C-D 0:3
每个球队的得分是:
A 4
B 2
C 2
D 6
进入总决赛的球队是:
A
D