问题描述
小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
解题思路
-
理解赛制:
- 如果队伍数为偶数,每两支队伍配对进行一场比赛,产生一半的队伍进入下一轮。
- 如果队伍数为奇数,一支队伍轮空直接晋级,其余队伍配对进行比赛,产生一半的队伍加上轮空的队伍进入下一轮。
-
计算配对次数:
- 初始队伍数为
n。 - 每次比赛后,队伍数减少到一半(偶数)或一半加一(奇数)。
- 直到队伍数减少到1为止,记录每次比赛的次数。
- 初始队伍数为
-
算法步骤:
-
初始化一个计数器
count为0。 -
当
n大于1时,进行以下操作:- 如果
n为偶数,进行n / 2场比赛。 - 如果
n为奇数,进行(n - 1) / 2场比赛。 - 更新
n为n / 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)