比赛配对问题解析(Java代码) | 豆包MarsCode AI刷题

39 阅读3分钟

问题描述

小R正在组织一个比赛,比赛中有 n 支队伍参赛。比赛遵循以下独特的赛制:

  • 如果当前队伍数为 偶数,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,且产生 n / 2 支队伍进入下一轮。
  • 如果当前队伍数为 奇数,那么将会随机轮空并晋级一支队伍,其余的队伍配对。总共进行 (n - 1) / 2 场比赛,且产生 (n - 1) / 2 + 1 支队伍进入下一轮。

小R想知道在比赛中进行的配对次数,直到决出唯一的获胜队伍为止。

测试样例

样例1:

输入:n = 7
输出:6

样例2:

输入:n = 14
输出:13

样例3:

输入:n = 1
输出:`0

接下来让我们对该题进行拆解分析。首先,我们需要理解比赛的过程:

  1. 初始队伍数:从 n 支队伍开始。

  2. 每一轮

    • 如果队伍数是偶数,每支队伍都会与另一支队伍配对,进行 n / 2 场比赛,剩下 n / 2 支队伍。
    • 如果队伍数是奇数,随机轮空并晋级一支队伍,其余的队伍配对,进行 (n - 1) / 2 场比赛,剩下 (n - 1) / 2 + 1 支队伍。
  3. 终止条件:当只剩下 1 支队伍时,比赛结束。

我们需要计算从 n 支队伍到剩下 1 支队伍的过程中,总共进行了多少场比赛。

在此我分享一种思路,我们所需要的变量和过程如下:

  1. 初始化计数器:我们需要一个变量来记录总共进行的比赛次数。

  2. 循环处理每一轮

    • 如果当前队伍数是偶数,计算比赛次数并更新队伍数。
    • 如果当前队伍数是奇数,计算比赛次数并更新队伍数。
  3. 终止条件:当队伍数减少到 1 时,停止循环。

本题中偶数数队伍的处理简单,难点在于奇数数队伍的处理。

在进行奇数数队伍的处理时,我们可以这么思考:

在处理奇数队伍的轮空情况时,我们需要确保有一支队伍直接晋级,而其余的队伍进行配对比赛。实现思路如下:

  1. 计算比赛次数:对于奇数队伍数 n,进行 (n - 1) / 2 场比赛。
  2. 更新队伍数:剩下的队伍数为 (n - 1) / 2 + 1

题目分析完毕,接下来进入实战环节,代码实现过程如下:

class Main {
    public static int solution(int n) {
        int matches = 0; // 初始化比赛次数

        while (n > 1) { // 当队伍数大于 1 时继续比赛
            if (n % 2 == 0) {
                // 偶数队伍数的情况
                matches += n / 2; // 进行 n / 2 场比赛
                n = n / 2; // 剩下 n / 2 支队伍
            } else {
                // 奇数队伍数的情况
                matches += (n - 1) / 2; // 进行 (n - 1) / 2 场比赛
                n = (n - 1) / 2 + 1; // 剩下 (n - 1) / 2 + 1 支队伍
            }
        }

        return matches; // 返回总比赛次数
    }

    public static void main(String[] args) {
        System.out.println(solution(7) == 6);
        System.out.println(solution(14) == 13);
        System.out.println(solution(1) == 0);
    }
}

总结

  • 奇数队伍的轮空情况:计算比赛次数为 (n - 1) / 2,更新队伍数为 (n - 1) / 2 + 1
  • 偶数队伍的情况:计算比赛次数为 n / 2,更新队伍数为 n / 2

通过这种方式,代码可以正确处理奇数队伍的轮空情况,并计算出总的比赛次数。

至此本题解析完毕。本题较为基础,便于初学者练习奇偶问题的处理方法,如果有更好思路,不妨在评论区进行留言,欢迎大家的讨论。