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

        }

    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 根据比赛规则胜者得3,和者得1败者得分。因此,各人总得分高到进行排名的规则如下: 1. 总得分最高的选手排名第一; 2. 如果有两个或多个选手总得分相同,则按照胜利场次多少进行排名,胜利场次多的选手排名靠前; 3. 如果胜利场次也相同,则按照净胜球数进行排名,净胜球数多的选手排名靠前; 4. 如果净胜球数也相同,则按照进球数进行排名,进球数多的选手排名靠前; 5. 如果进球数也相同,则按照比赛时间先后进行排名,先比赛的选手排名靠前。 以上就是根据各人总得分高到进行排名的规则。 ### 回答2: 假设这个循环赛有n支队伍参加,初始时每个队伍的得分都是0。每场比赛有两支队伍,赢得比赛的队伍得3,平局各得1,输掉比赛的队伍得0。那么我们可以用一个n * n的矩阵来表示每场比赛的结果,第i行j列表示第i支队伍与第j支队伍之间的比赛结果。如果第i支队伍赢了第j支队伍,则在第i行j列的位置标记为3,如果平局,则标记为1,如果第i支队伍输了,则标记为0。注意到这样表示的矩阵是对称的,即第i行j列和第j行i列的值相等。 接下来我们需要计算每支队伍的总得分,我们可以使用一个长度为n的数组来记录每支队伍的得分。对于第i支队伍而言,它的得分就是矩阵的第i行的和,即它赢得的比赛数乘以3加上它平局的比赛数。在计算总得分的时候,需要注意不要重复计算同一场比赛。 得到每个队伍的得分之后,我们可以对它们按照得分高到进行排名。可以使用一个二元组来表示每支队伍,第一个元素表示队伍的得分,第二个元素表示队伍的编号(从1到n)。然后将所有的二元组按照得分高到排序即可。 总之,根据各人总得分高到进行排名的步骤如下: 1. 用n * n的矩阵表示所有比赛的结果; 2. 用长度为n的数组计算每支队伍的总得分; 3. 将得分和队伍编号组成的二元组进行排序; 4. 按照得分高到输出各个队伍的排名。 以上就是某循环赛比赛规则胜者得3,和者得1败者得分,从高到进行排名的详细步骤。 ### 回答3: 某循环赛比赛规则胜者得3,和者得1败者得分。一共有6个参赛选手,每个选手都与其他5个选手进行比赛,共进行了15场比赛。现在需要根据各人总得分高到进行排名。 首先,需要计算每个选手的总得分。根据比赛规则,每个胜者得到3,和者得到1败者得分。因此,需要统计每个选手的胜场数和和局数,再根据比赛规则计算总得分。 比如选手A与其他选手进行了5场比赛,共获得2胜1平2负,那么他的总得分就是2×3 + 1×1 = 7。 接下来,可以将每个选手的总得分高到排列,得到最终的排名。 例如: 选手|总得分 ---|--- B|14 C|10 A|7 D|7 E|5 F|3 其中,B选手排名第一,总得分为14,他在比赛中获得了4场胜利和3场平局,没有输过。C选手排名第二,总得分10,他在比赛中获得了3场胜利、1场平局和1场失利。A和D选手的总得分相同,但A因为获胜次数更多而排名较高。E和F选手的总得分别为5和3排名最后。 因此,某循环赛排名取决于比赛中的胜负平情况和比赛规则总得分决定了选手的排名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

超好的小白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值