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

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

问题理解

你需要计算在一个比赛中,从初始的 n 支队伍开始,直到决出唯一的获胜队伍为止,总共进行的配对次数。

关键点

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

解题思路

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

  2. 循环处理

    • 如果当前队伍数为偶数,计算配对次数并更新队伍数。
    • 如果当前队伍数为奇数,计算配对次数并更新队伍数。
  3. 终止条件:当队伍数减少到 1 时,比赛结束。

算法步骤

  1. 初始化一个变量 total_matches 用于记录总的配对次数。

  2. 使用一个循环,直到队伍数减少到 1:

    • 如果队伍数为偶数,计算当前轮的配对次数并更新队伍数。
    • 如果队伍数为奇数,计算当前轮的配对次数并更新队伍数。
  3. 返回 total_matches

实现代码

def solution(n: int) -> int:
    # 初始化总配对次数
    total_matches = 0
    
    # 循环直到队伍数减少到1
    while n > 1:
        if n % 2 == 0:
            # 如果队伍数为偶数
            # 计算当前轮的配对次数
            matches_this_round = n // 2
            # 更新队伍数
            n = n // 2
        else:
            # 如果队伍数为奇数
            # 计算当前轮的配对次数
            matches_this_round = (n - 1) // 2
            # 更新队伍数
            n = (n - 1) // 2 + 1
        
        # 累加当前轮的配对次数到总配对次数
        total_matches += matches_this_round
    
    return total_matches

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

以下是我在编写这段代码时可能会遇到的易错点:

个人易错点

  1. 循环条件

    • 循环条件 while n > 1 必须正确,否则可能会导致无限循环或提前退出循环。
  2. 偶数队伍的处理

    • 在偶数队伍的情况下,计算配对次数时使用 n // 2,而不是 n / 2,以确保结果是整数。
    • 更新队伍数时也要使用 n // 2,以确保下一轮的队伍数正确。
  3. 奇数队伍的处理

    • 在奇数队伍的情况下,计算配对次数时使用 (n - 1) // 2,而不是 n // 2,以确保结果是整数。
    • 更新队伍数时使用 (n - 1) // 2 + 1,以确保轮空的一支队伍正确晋级。
  4. 累加配对次数

    • 每次计算完当前轮的配对次数后,必须将其累加到 total_matches 中,否则总配对次数会不正确。

虽然题目不是很难,但是需要一定的细心呀!

1732619255889.png