比赛配对问题 | 豆包MarsCode AI刷题

49 阅读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

比赛配对问题笔记

问题描述

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

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

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

解题思路

  1. 理解配对规则

    • 如果队伍数 n 是偶数,配对次数为 n / 2,剩下 n / 2 支队伍。
    • 如果队伍数 n 是奇数,配对次数为 (n - 1) / 2,剩下 (n - 1) / 2 + 1 支队伍。
  2. 递归或迭代

    • 我们可以使用递归或迭代的方式来计算总的配对次数。每次配对后,更新队伍数 n,直到 n 变为 1。
    # 基本情况:如果只有一支队伍,不需要配对
    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)

关键步骤解释

  1. 基本情况:当 n 为 1 时,返回 0,因为不需要配对。

  2. 递归情况

    • 计算当前轮的配对次数 pairs
    • 计算下一轮的队伍数 next_round_teams
    • 递归调用 solution(next_round_teams) 计算下一轮的配对次数,并将其加到当前轮的配对次数上。

测试样例

  • 样例1n = 7,输出 6
  • 样例2n = 14,输出 13
  • 样例3n = 1,输出 0

总结

  • 通过递归的方式,我们可以有效地计算出从 n 支队伍开始,直到决出唯一获胜队伍为止的配对次数。
  • 关键在于正确处理队伍数为奇数和偶数的情况,并递归地计算每一轮的配对次数。