比赛配对问题
问题描述
小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
比赛配对问题笔记
问题描述
小R正在组织一个比赛,比赛中有 n 支队伍参赛。比赛遵循以下独特的赛制:
- 如果当前队伍数为 偶数,那么每支队伍都会与另一支队伍配对。总共进行
n / 2场比赛,且产生n / 2支队伍进入下一轮。 - 如果当前队伍数为 奇数,那么将会随机轮空并晋级一支队伍,其余的队伍配对。总共进行
(n - 1) / 2场比赛,且产生(n - 1) / 2 + 1支队伍进入下一轮。
小R想知道在比赛中进行的配对次数,直到决出唯一的获胜队伍为止。
解题思路
-
理解配对规则:
- 如果队伍数
n是偶数,配对次数为n / 2,剩下n / 2支队伍。 - 如果队伍数
n是奇数,配对次数为(n - 1) / 2,剩下(n - 1) / 2 + 1支队伍。
- 如果队伍数
-
递归或迭代:
- 我们可以使用递归或迭代的方式来计算总的配对次数。每次配对后,更新队伍数
n,直到n变为 1。
- 我们可以使用递归或迭代的方式来计算总的配对次数。每次配对后,更新队伍数
# 基本情况:如果只有一支队伍,不需要配对
if n == 1:
return 0
# 递归情况:计算当前轮的配对次数,并递归计算下一轮的配对次数
if n % 2 == 0:
# 偶数队伍数
pairs = n // 2
next_round_teams = n // 2
else:
# 奇数队伍数
pairs = (n - 1) // 2
next_round_teams = (n - 1) // 2 + 1
# 递归调用,计算下一轮的配对次数
return pairs + solution(next_round_teams)
if __name__ == '__main__':
print(solution(7) == 6)
print(solution(14) == 13)
print(solution(1) == 0)
关键步骤解释
-
基本情况:当
n为 1 时,返回 0,因为不需要配对。 -
递归情况:
- 计算当前轮的配对次数
pairs。 - 计算下一轮的队伍数
next_round_teams。 - 递归调用
solution(next_round_teams)计算下一轮的配对次数,并将其加到当前轮的配对次数上。
- 计算当前轮的配对次数
测试样例
- 样例1:
n = 7,输出6。 - 样例2:
n = 14,输出13。 - 样例3:
n = 1,输出0。
总结
- 通过递归的方式,我们可以有效地计算出从
n支队伍开始,直到决出唯一获胜队伍为止的配对次数。 - 关键在于正确处理队伍数为奇数和偶数的情况,并递归地计算每一轮的配对次数。