问题描述
小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 支队伍开始,直到决出唯一的获胜队伍为止,总共进行的配对次数。
关键点
- 偶数队伍:如果当前队伍数为偶数,每支队伍都会与另一支队伍配对,进行
n / 2场比赛,产生n / 2支队伍进入下一轮。 - 奇数队伍:如果当前队伍数为奇数,随机轮空并晋级一支队伍,其余的队伍配对,进行
(n - 1) / 2场比赛,产生(n - 1) / 2 + 1支队伍进入下一轮。
解题思路
-
初始条件:从
n支队伍开始。 -
循环处理:
- 如果当前队伍数为偶数,计算配对次数并更新队伍数。
- 如果当前队伍数为奇数,计算配对次数并更新队伍数。
-
终止条件:当队伍数减少到 1 时,比赛结束。
算法步骤
-
初始化一个变量
total_matches用于记录总的配对次数。 -
使用一个循环,直到队伍数减少到 1:
- 如果队伍数为偶数,计算当前轮的配对次数并更新队伍数。
- 如果队伍数为奇数,计算当前轮的配对次数并更新队伍数。
-
返回
total_matches。
实现代码
def solution(n: int) -> int:
# 初始化总配对次数
total_matches = 0
# 循环直到队伍数减少到1
while n > 1:
if n % 2 == 0:
# 如果队伍数为偶数
# 计算当前轮的配对次数
matches_this_round = n // 2
# 更新队伍数
n = n // 2
else:
# 如果队伍数为奇数
# 计算当前轮的配对次数
matches_this_round = (n - 1) // 2
# 更新队伍数
n = (n - 1) // 2 + 1
# 累加当前轮的配对次数到总配对次数
total_matches += matches_this_round
return total_matches
if __name__ == '__main__':
print(solution(7) == 6)
print(solution(14) == 13)
print(solution(1) == 0)
以下是我在编写这段代码时可能会遇到的易错点:
个人易错点
-
循环条件:
- 循环条件
while n > 1必须正确,否则可能会导致无限循环或提前退出循环。
- 循环条件
-
偶数队伍的处理:
- 在偶数队伍的情况下,计算配对次数时使用
n // 2,而不是n / 2,以确保结果是整数。 - 更新队伍数时也要使用
n // 2,以确保下一轮的队伍数正确。
- 在偶数队伍的情况下,计算配对次数时使用
-
奇数队伍的处理:
- 在奇数队伍的情况下,计算配对次数时使用
(n - 1) // 2,而不是n // 2,以确保结果是整数。 - 更新队伍数时使用
(n - 1) // 2 + 1,以确保轮空的一支队伍正确晋级。
- 在奇数队伍的情况下,计算配对次数时使用
-
累加配对次数:
- 每次计算完当前轮的配对次数后,必须将其累加到
total_matches中,否则总配对次数会不正确。
- 每次计算完当前轮的配对次数后,必须将其累加到
虽然题目不是很难,但是需要一定的细心呀!