7-4 竞赛排名 (10 分)失败

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();
            }

        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超好的小白

没体验过打赏,能让我体验一次吗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值