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

71 阅读3分钟

问题描述

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

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

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

测试样例

样例一:

输入: n = 7 输出:6

样例二:

输入: n = 14 输出:13

解题思路

  1. 理解问题

    • 我们需要计算从 n 支队伍到剩下 1 支队伍的配对次数。
    • 每次配对会减少一半的队伍(偶数)或减少一半加一(奇数)。
  2. 算法步骤

    1. 初始化计数器:设置一个变量matches来记录总的配对次数,初始值为0。

    2. 循环处理:使用一个循环,当队伍数n大于1时,执行以下步骤:

      • 偶数情况:如果n是偶数,那么配对次数增加n / 2,因为每两支队伍配对一次,然后队伍数n减半。
      • 奇数情况:如果n是奇数,那么配对次数增加(n - 1) / 2,因为除了轮空的队伍,其余的队伍都要配对,然后队伍数n变为(n - 1) / 2 + 1
  3. 循环结束条件:当队伍数n减少到1时,循环结束。

  4. 返回结果:返回matches变量的值,即总的配对次数。

代码实现

def solution(n: int) -> int:
    matches = 0  # 初始化配对次数
    while n > 1:
        if n % 2 == 0:
            # 偶数队伍的情况
            matches += n // 2
            n //= 2
        else:
            # 奇数队伍的情况
            matches += (n - 1) // 2
            n = (n - 1) // 2 + 1
    return matches

if __name__ == '__main__':
    print(solution(7) == 6)
    print(solution(14) == 13)
    print(solution(1) == 0)
总结
  1. 递归思维:这个问题可以通过递归的方式来思考,每一步都是将问题规模减半,直到达到基本情况(即队伍数为1)。
  2. 迭代实现:虽然问题可以通过递归解决,但这里使用了迭代的方式,因为迭代通常在性能上更优,尤其是在处理大规模数据时。
  3. 条件判断:在循环中,需要对队伍数n的奇偶性进行判断,这是解决问题的关键步骤。
  4. 代码简洁性:代码实现简洁明了,易于理解和维护。
  5. 测试验证:通过几个测试样例来验证算法的正确性,这是软件开发中非常重要的一步,确保算法能够正确处理各种情况。

通过这个问题,我学习到了如何将实际问题转化为编程问题,并使用简单的迭代方法来解决。