比赛配对问题

201 阅读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 class Main { public static int solution(int n) { // 如果当前队伍数为1,直接返回0 if (n == 1) { return 0; }

    // 计算当前轮次的配对次数
    int pairs = n / 2;
    
    // 计算剩余队伍数
    int remainingTeams = (n % 2 == 0) ? n / 2 : n / 2 + 1;
    
    // 递归计算下一轮的配对次数,并加上当前轮次的配对次数
    return pairs + solution(remainingTeams);
}

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

}

解题思路

  1. 理解问题:我们需要计算在比赛中进行的配对次数,直到决出唯一的获胜队伍为止。

  2. 数据结构选择:由于我们只需要计算配对次数,不需要实际模拟比赛过程,因此不需要复杂的数据结构。

  3. 算法步骤

    • 如果当前队伍数 n 为 1,则直接返回 0。

    • 否则,计算当前轮次的配对次数:

      • 如果 n 为偶数,配对次数为 n / 2,剩余队伍数为 n / 2
      • 如果 n 为奇数,配对次数为 (n - 1) / 2,剩余队伍数为 (n - 1) / 2 + 1
    • 将剩余队伍数作为下一轮的队伍数,继续计算配对次数,直到队伍数为 1

    • 关键步骤解释

  4. 递归终止条件:当 n 为 1 时,直接返回 0。

  5. 计算配对次数:根据 n 的奇偶性计算当前轮次的配对次数。

  6. 递归调用:将剩余队伍数作为参数,递归调用 solution 函数,并将当前轮次的配对次数累加到结果中。

如何处理奇数队伍的轮空情况? 处理奇数队伍的轮空情况是这个问题的关键部分。让我们来看看如何在代码中处理这种情况。

解题思路

  1. 理解问题:当队伍数为奇数时,会有一支队伍轮空并直接晋级到下一轮。

  2. 数据结构选择:我们只需要计算配对次数,因此不需要复杂的数据结构。

  3. 算法步骤

    • 如果当前队伍数 n 为 1,则直接返回 0。

    • 否则,计算当前轮次的配对次数:

      • 如果 n 为偶数,配对次数为 n / 2,剩余队伍数为 n / 2
      • 如果 n 为奇数,配对次数为 (n - 1) / 2,剩余队伍数为 (n - 1) / 2 + 1
    • 将剩余队伍数作为下一轮的队伍数,继续计算配对次数,直到队伍数为 1。