7-4 竞赛排名 (10 分)
某循环赛的比赛规则是胜者得3分,和者得1分,败者不得分。请根据各人总得分从高到低进行排名。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试先输入一个整数n(2≤n≤100),表示参赛人数,然后输入n*(n-1)/2行,每行一个比赛结果。每行比赛结果由A、B、f构成,A和B为参赛人名(不含空格),f=1表示A胜B,f=0表示A与B打和。由于总是将胜者排在前面,所以不存在A败于B的情况。
输出格式:
对于每组测试,按名次分行输出,名次与名字之间以一个空格间隔,并列名次的名字在同一行输出,按字典序以一个空格隔开。
输入样例:
1
3
Jack Smith 0
Smith Bob 1
Jack Bob 1
输出样例:
1 Jack Smith
3 Bob
出处:
ZJUTOJ 1330
哇哇哇哇哇哇哇哇哇哇我不晓得哪里不对啊过不到啊啊啊
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
for (int q = 0; q < T; q++) {
int n = scanner.nextInt();
int N = n * (n - 1) / 2;
Map<String, Integer> map = new HashMap<>();//键表示名字,值表示得分
scanner.nextLine();//吃掉上一个输入的回车。
for (int i = 0; i < N; i++) {
String strings[] = scanner.nextLine().split(" ");
//string[0] 表示第一个人名,string[1] 表示第二个人名,string[2] 表示结果
if (!map.keySet().contains(strings[0])) {
map.put(strings[0], 0);
}
if (!map.keySet().contains(strings[1])) {
map.put(strings[1], 0);
}
if (strings[2].equals("0")) {
//进行加分
map.put(strings[0], map.get(strings[0]) + 1);
map.put(strings[1], map.get(strings[1]) + 1);
}
if (strings[2].equals("1")) {
//进行加分
map.put(strings[0], map.get(strings[0]) + 3);
}
}
int c = 0;//用作下标记录
String name[] = new String[map.keySet().size()];
int score[] = new int[map.keySet().size()];
for (Map.Entry<String, Integer> entry : map.entrySet()) {
//进行赋值
name[c] = entry.getKey();
score[c] = entry.getValue();
// System.out.println(entry.getKey() + " " + entry.getValue());
c++;//下标++
}
//进行排序
for (int i = 0; i < c; i++) {////需进行n次冒泡,这里决定进行多少次冒泡
for (int j = 0; j < c - i - 1; j++) {//要减1,很重要。因为最后一个数必定为最大,不用再比较最后一个数。
if (score[j] < score[j + 1]) {
int tem = score[j];
score[j] = score[j + 1];
score[j + 1] = tem;
String st = String.valueOf(name[j]);
name[j] = String.valueOf(name[j + 1]);
name[j + 1] = String.valueOf(st);
}
if (score[j] == score[j + 1]) {
if (name[j].charAt(0) > name[j + 1].charAt(0)) {
int tem = score[j];
score[j] = score[j + 1];
score[j + 1] = tem;
//字典顺序即为ascll码由小到大。
String st = String.valueOf(name[j]);
name[j] = String.valueOf(name[j + 1]);
name[j + 1] = String.valueOf(st);
}
}
}
}
// for (int i = 0; i < c; i++) {
// System.out.println(name[i]+" "+score[i]);
// }
//输出
int i = 0;
while (i<c) {
System.out.print(i + 1);
int sc = score[i];
System.out.print(" " + name[i]);
while (i + 1 < c) {
if (sc == score[i +1]) {
System.out.print(" " + name[i + 1]);
i++;
} else {
break;
}
}
i++;
System.out.println();
}
}
}
}