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

84 阅读2分钟

问题描述 小R正在组织一个比赛,比赛中有n支参赛队伍。比赛遵循以下独特的赛制: 1.如果当前队伍数为偶数,那么每支队伍都会与另一支队伍配对。总共进行n /2场比赛,且产生n / 2支队伍进入下一轮。 2.如果当前队伍数为奇数,那么将会随机轮空并晋级一支队伍,其余队伍配对。总共进行(n-1)/2场比赛,且产生(n-1)/2+1支队伍进入下一轮。 小R想知道在比赛中进行的配对次数,直到决出唯一的获胜队伍为止。

测试样例 样例一:输入:n=7 输出:6 样例二:输入:n=14 输出:13 样例三:输入:n=1 输出:0 AI解析

好的,让我们来逐步解决这个问题。首先,我们需要理解题目要求:计算从 n 支队伍开始,直到决出唯一获胜队伍为止的配对次数。

解题思路

  1. 初始条件:如果队伍数 n 为 1,那么不需要进行任何配对,直接返回 0。
  2. 递归或迭代
    • 如果队伍数 n 为偶数,那么进行 n / 2 场比赛,并产生 n / 2 支队伍进入下一轮。
    • 如果队伍数 n 为奇数,那么进行 (n - 1) / 2 场比赛,并产生 (n - 1) / 2 + 1 支队伍进入下一轮。
  3. 累加配对次数:每次配对后,累加当前轮的配对次数,并更新队伍数,直到队伍数为 1。

代码提示

我们可以使用一个循环来实现这个逻辑。以下是代码框架:

def solution(n: int) -> int:
    # 初始化配对次数
    pair_count = 0
    
    # 当队伍数大于1时,继续进行配对
    while n > 1:
        if n % 2 == 0:
            # 如果队伍数为偶数
            # 进行 n / 2 场比赛
            pair_count += n // 2
            # 更新队伍数为 n / 2
            n = n // 2
        else:
            # 如果队伍数为奇数
            # 进行 (n - 1) / 2 场比赛
            pair_count += (n - 1) // 2
            # 更新队伍数为 (n - 1) / 2 + 1
            n = (n - 1) // 2 + 1
    
    return pair_count

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

关键步骤解释

  1. 初始化pair_count 用于记录总的配对次数。
  2. 循环:当 n > 1 时,继续进行配对。
  3. 偶数处理:如果 n 是偶数,进行 n // 2 场比赛,并将 n 更新为 n // 2
  4. 奇数处理:如果 n 是奇数,进行 (n - 1) // 2 场比赛,并将 n 更新为 (n - 1) // 2 + 1
  5. 返回结果:当 n 变为 1 时,返回 pair_count

你可以根据这个框架继续完善代码,或者直接使用这个框架来实现最终的解决方案。