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

107 阅读3分钟

题目背景

小R正在组织一场比赛,该比赛有n支队伍参与,并遵循一种独特的淘汰赛制。在这种赛制下,队伍会根据其当前的数量进行配对和晋级,直到最后只剩下一支获胜队伍。

独特赛制解析

  • 当参赛队伍数量为偶数时

    • 所有的队伍都会被两两配对。
    • 进行n / 2场比赛。
    • 每场比赛后,胜出的队伍晋级到下一轮。
    • 因此,晋级到下一轮的队伍数量也是n / 2
  • 当参赛队伍数量为奇数时

    • 随机选择一支队伍轮空,直接晋级到下一轮。
    • 剩下的n - 1支队伍会被两两配对。
    • 进行(n - 1) / 2场比赛。
    • 每场比赛后,胜出的队伍以及轮空的队伍一起晋级到下一轮。
    • 因此,晋级到下一轮的队伍数量是(n - 1) / 2 + 1

题目要求

根据这种独特的赛制,小R希望知道从比赛开始到决出唯一获胜队伍为止,总共需要进行的配对次数。

解题思路

  1. 初始化配对次数:设置一个计数器match_count,用于记录总共进行的配对次数,初始值为0。

  2. 循环模拟比赛:使用一个while循环来模拟比赛的进行,直到只剩下一支队伍(即n等于1)时结束循环。

  3. 判断队伍数量:在每次循环中,根据当前队伍数量n的奇偶性,计算当前轮次的配对次数,并更新n的值。

    • 如果n为偶数,则进行n / 2场比赛,并将n更新为n / 2
    • 如果n为奇数,则进行(n - 1) / 2场比赛,并将n更新为(n - 1) / 2 + 1
  4. 返回结果:当循环结束时,返回match_count的值,即为总共进行的配对次数。

示例解析

  • 示例1:输入n = 7,输出6

    • 第一轮:7支队伍,3场比赛,晋级4支队伍。
    • 第二轮:4支队伍,2场比赛,晋级2支队伍。
    • 第三轮:2支队伍,1场比赛,决出胜者。
    • 总共6场比赛。
  • 示例2:输入n = 14,输出13

    • 第一轮:14支队伍,7场比赛,晋级7支队伍。
    • 第二轮:7支队伍,3场比赛,晋级4支队伍。
    • 第三轮:4支队伍,2场比赛,晋级2支队伍。
    • 第四轮:2支队伍,1场比赛,决出胜者。
    • 总共13场比赛。
  • 示例3:输入n = 1,输出0

    • 只有1支队伍,无需比赛。

代码编写

使用了一个while循环来模拟比赛的进行,直到只剩下一支队伍为止。在每次循环中,根据当前队伍数n的奇偶性来计算配对次数并更新n的值。

def solution(n: int) -> int:

    match_count = 0  # 初始化配对次数为0

    while n > 1:  # 当队伍数大于1时,继续循环

        if n % 2 == 0:  # 如果队伍数为偶数

            match_count += n // 2  # 配对次数增加n/2

            n //= 2  # 更新队伍数为n/2

        else:  # 如果队伍数为奇数

            match_count += (n - 1) // 2  # 配对次数增加(n-1)/2

            n = (n - 1) // 2 + 1  # 更新队伍数为(n-1)/2 + 1

    return match_count  # 返回总的配对次数

结论

通过上述解析,我们可以清晰地理解题目的背景、赛制、要求和解题思路。同时,通过示例的解析,我们可以验证解题思路的正确性。因此,我们可以根据这个解题思路来编写代码,以计算总共需要进行的配对次数。