AI 刷题20. 比赛配对题解 | 豆包MarsCode AI刷题

31 阅读3分钟

问题描述

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

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

小R想知道在比赛中进行的配对次数,直到决出唯一的获胜队伍为止。 好的,我会给你一些代码提示,帮助你完善当前的代码。

代码提示

  1. 基本情况处理

    • 你已经正确处理了 n == 1 的情况,返回 0
  2. 递归情况处理

    • 你需要分别处理队伍数为偶数和奇数的情况。
    • 对于偶数队伍数,计算当前轮的配对次数 pairs 和下一轮的队伍数 next_round_teams
    • 对于奇数队伍数,同样计算当前轮的配对次数 pairs 和下一轮的队伍数 next_round_teams
  3. 递归调用

    • 你需要递归调用 solution 函数,并累加当前轮的配对次数。
  4. 测试用例

    • 你已经提供了一些测试用例,确保这些测试用例能够覆盖所有可能的情况。

代码框架

def solution(n: int) -> int:
    # 基本情况:如果只有一支队伍,不需要配对
    if n == 1:
        return 0
    
    # 递归情况:计算当前轮的配对次数,并递归计算下一轮的配对次数
    if n % 2 == 0:
        # 偶数队伍数
        pairs = n // 2
        next_round_teams = n // 2
    else:
        # 奇数队伍数
        pairs = (n - 1) // 2
        next_round_teams = (n - 1) // 2 + 1
    
    # 递归调用并累加配对次数
    return pairs + solution(next_round_teams)

if __name__ == '__main__':
    print(solution(7) == 6)
    print(solution(14) == 13)
    print(solution(1) == 0)

关键步骤

  • 计算配对次数

    • 对于偶数队伍数,配对次数为 n // 2
    • 对于奇数队伍数,配对次数为 (n - 1) // 2
  • 计算下一轮的队伍数

    • 对于偶数队伍数,下一轮的队伍数为 n // 2
    • 对于奇数队伍数,下一轮的队伍数为 (n - 1) // 2 + 1
  • 递归调用

    • 递归调用 solution(next_round_teams) 并累加当前轮的配对次数。

好的,让我们来总结一下解决这个问题的关键知识点。

关键知识点

  1. 递归(Recursion)

    • 递归是一种通过函数调用自身来解决问题的方法。在这个问题中,我们需要递归地计算每一轮的配对次数,直到只剩下一个队伍。
    • 递归函数通常包含两个部分:基本情况(base case)和递归情况(recursive case)。
  2. 基本情况(Base Case)

    • 基本情况是递归函数的终止条件。在这个问题中,当队伍数 n 为 1 时,不需要进行任何配对,因此返回 0
  3. 递归情况(Recursive Case)

    • 递归情况是函数调用自身的情况。在这个问题中,我们需要根据当前队伍数 n 计算当前轮的配对次数,并递归调用函数计算下一轮的配对次数。
  4. 条件判断

    • 使用条件判断来处理不同的情况。在这个问题中,我们需要分别处理队伍数为偶数和奇数的情况。
    • 对于偶数队伍数,配对次数为 n // 2,下一轮的队伍数为 n // 2
    • 对于奇数队伍数,配对次数为 (n - 1) // 2,下一轮的队伍数为 (n - 1) // 2 + 1
  5. 累加配对次数

    • 在递归调用中,我们需要累加每一轮的配对次数,直到递归结束。

总结

通过递归和条件判断,我们可以有效地解决这个问题。关键在于理解递归的基本概念,正确处理基本情况和递归情况,并根据队伍数的奇偶性进行相应的计算。