简单题:比赛配对问题 | 豆包Mars Code AI刷题

59 阅读2分钟

问题描述

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

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

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

测试样例

样例1

输入:`n = 7`  
输出:`6`

样例2

输入:`n = 14`  
输出:`13`

样例3

输入:`n = 1`  
输出:`0`

解题思路

  1. 首先要理解清楚题目所说的意思;

  2. 初始条件:如果队伍数 n 为 1,则不需要进行任何比赛,直接返回 0。

  3. 循环处理

    • 如果当前队伍数 n 为偶数,进行 n / 2 场比赛,队伍数变为 n / 2
    • 如果当前队伍数 n 为奇数,进行 (n - 1) / 2 场比赛,队伍数变为 (n - 1) / 2 + 1
  4. 累计比赛次数:在每次循环中,累计当前轮次的比赛次数。

  5. 终止条件:当队伍数变为 1 时,循环结束。

详细实现

def solution(n: int) -> int:
    matches = 0
    while n > 1:
        if n % 2 ==0:            #当n为偶数时
            matches += n / 2
            n = n / 2
        else:                    #当n为奇数时
            matches += (n - 1) / 2
            n = (n - 1) / 2 + 1
    return matches               #返回matches
    
if __name__ == '__main__':
    print(solution(7) == 6)
    print(solution(14) == 13)
    print(solution(1) == 0)

代码解释

  1. matches = 0初始化为0;
  2. matches += n / 2在每次循环中,累计当前的比赛次数(在n为偶数时),matches += (n - 1) / 2即n为奇数时;

借鉴

如果有和我不同思路的友友们,可以在评论区留言,留下你的思路和代码,一起学习一下!