比赛配对| 豆包MarsCode AI刷题

38 阅读3分钟

解题思路

这道题目旨在计算在一个比赛中,经过多轮淘汰赛后,进行的配对次数,直到决出唯一的获胜队伍为止。比赛的规则如下:

  1. 当队伍数为偶数时,每支队伍都会与另一支队伍配对,进行 n/2n / 2n/2 场比赛。
  2. 当队伍数为奇数时,将有一支队伍随机轮空,剩余队伍配对进行 (n−1)/2(n - 1) / 2(n−1)/2 场比赛,产生 (n−1)/2+1(n - 1) / 2 + 1(n−1)/2+1 支队伍进入下一轮。

步骤分析

  1. 初始化:首先,定义一个变量 total_pairs 来记录总的配对次数。

  2. 循环判断:使用一个 while 循环,条件是当前队伍数 n 大于 1。因为只有当队伍数大于 1 时,才会进行比赛。

  3. 处理偶数队伍

    • 如果 n 为偶数,则可以直接将队伍数除以 2,计算出本轮的配对次数,即 pairs = n // 2
    • 将这个配对次数加到 total_pairs 中,并更新队伍数 npairs(即进入下一轮的队伍数)。
  4. 处理奇数队伍

    • 如果 n 为奇数,首先需要将一支队伍轮空,所以实际进行的配对次数为 pairs = (n - 1) // 2
    • 同样,将这个配对次数加到 total_pairs 中,并更新队伍数 npairs + 1(即轮空的队伍加上配对后晋级的队伍)。
  5. 结束条件:当 n 变为 1 时,循环结束,返回 total_pairs,即总的配对次数。

示例分析

  • 示例 1:对于 n = 7 的情况:

    • 第一轮:轮空 1 支,进行 3 场比赛,进入 4 支队伍(配对次数 3)。
    • 第二轮:偶数,进行 2 场比赛,进入 2 支队伍(配对次数 2)。
    • 第三轮:偶数,进行 1 场比赛,进入 1 支队伍(配对次数 1)。
    • 总配对次数 = 3 + 2 + 1 = 6。
  • 示例 2:对于 n = 14 的情况:

    • 第一轮:偶数,进行 7 场比赛,进入 7 支队伍(配对次数 7)。
    • 第二轮:轮空 1 支,进行 3 场比赛,进入 4 支队伍(配对次数 3)。
    • 第三轮:偶数,进行 2 场比赛,进入 2 支队伍(配对次数 2)。
    • 第四轮:偶数,进行 1 场比赛,进入 1 支队伍(配对次数 1)。
    • 总配对次数 = 7 + 3 + 2 + 1 = 13。

代码实现

def solution(n: int) -> int:
    total_pairs = 0  # 初始化总配对次数
    while n > 1:  # 当队伍数大于1时继续进行
        if n % 2 == 0:  # 如果当前队伍数是偶数
            pairs = n // 2
            total_pairs += pairs
            n = pairs  # 产生 n/2 支队伍
        else:  # 如果当前队伍数是奇数
            pairs = (n - 1) // 2
            total_pairs += pairs
            n = pairs + 1  # 产生 (n-1)/2 + 1 支队伍
    return total_pairs

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

感悟与总结

通过这道题的解答,我们可以看到,利用简单的循环和条件判断即可有效地解决问题。这个过程不仅帮助我们理解了比赛的配对规则,还加深了对递归和迭代思想的理解。

在实际编程中,理解问题的结构和逻辑是非常重要的。通过将复杂问题分解为简单的步骤,我们能够更容易地找到解决方案。同时,这种类型的题目也强调了算法的时间复杂度,尤其是在需要处理大量数据时,优化算法的效率至关重要。

总结来说,这道题目不仅锻炼了我们的编程能力,还提升了我们对算法思维的理解。希望在今后的学习中,能够继续应用这些思维方式,解决更多复杂的问题。