问题描述
小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支队伍开始,直到决出唯一获胜队伍为止的配对次数。 - 递归或迭代:我们可以通过递归或迭代的方式来计算每一轮的配对次数。
- 边界条件:当队伍数为1时,不需要进行任何配对,直接返回0。
关键点:
·两两比完赛后剩下几对,n与paris都会变化,统计paris的数量。
·n有奇数偶数之分,但奇数的话有一个队伍会剩下,晋级下一轮,那么就可以进行n+1结果不会变化
代码实现
class Main {
public static int solution(int n) {
int pairs = 0;
while (n > 1) {
// 如果是偶数,配对次数为 n / 2
// 如果是奇数,配对次数为 (n - 1) / 2
pairs += n / 2;
// 更新下一轮的队伍数
n = (n + 1) / 2;
}
return pairs;
}
public static void main(String[] args) {
System.out.println(solution(7) == 6);
System.out.println(solution(14) == 13);
System.out.println(solution(1) == 0);
}
}
总结
·我们可以通过一个循环来模拟每一轮的比赛,直到只剩下一个队伍为止。每次循环中,我们根据当前队伍数是奇数还是偶数来决定配对次数。
·判断队伍数是否为奇数:如果是奇数,我们需要确保有一支队伍直接晋级。
·计算配对次数:对于奇数队伍,配对次数为 (n - 1) / 2。
·更新下一轮的队伍数:对于奇数队伍,下一轮的队伍数为 (n - 1) / 2 + 1。
·代码看似简单但是在处理奇数偶数方面的+1还是需要思考,建议画出比赛图(忽略轮数)