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

76 阅读2分钟

问题描述

小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

解题思路

  1. 理解赛制

    • 如果队伍数为偶数,每两支队伍配对进行一场比赛,产生一半的队伍进入下一轮。
    • 如果队伍数为奇数,一支队伍轮空直接晋级,其余队伍配对进行比赛,产生一半的队伍加上轮空的队伍进入下一轮。
  2. 计算配对次数

    • 初始队伍数为 n
    • 每次比赛后,队伍数减少到一半(偶数)或一半加一(奇数)。
    • 直到队伍数减少到1为止,记录每次比赛的次数。
  3. 算法步骤

    • 初始化一个计数器 count 为0。

    • n 大于1时,进行以下操作:

      • 如果 n 为偶数,进行 n / 2 场比赛。
      • 如果 n 为奇数,进行 (n - 1) / 2 场比赛。
      • 更新 nn / 2(n + 1) / 2
      • 增加 count 的值。
    • 返回 count 作为结果。

通过上述步骤,可以计算出从 n 支队伍到决出唯一获胜队伍所需的配对次数。

def solution(n: int) -> int:
    # 初始化计数器
    count = 0
​
    # 循环处理每一轮比赛
    while n > 1:
        if n % 2 == 0:
            count += n // 2
            n //= 2
        else:
            count += (n - 1) // 2
            n = (n + 1) // 2
​
    return count
​
​
if __name__ == '__main__':
    print(solution(7) == 6)
    print(solution(14) == 13)
    print(solution(1) == 0)
​