比赛配对问题

134 阅读2分钟

问题描述

小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,赛制为偶数队伍时配对淘汰,奇数队伍时随机轮空一支并配对淘汰,直到决出唯一获胜队伍,询问总配对次数。

解题思路

  1. 理解问题:我们需要计算从 n 支队伍开始,直到决出唯一获胜队伍为止的配对次数。
  2. 递归或迭代:我们可以通过递归或迭代的方式来计算每一轮的配对次数。
  3. 边界条件:当队伍数为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还是需要思考,建议画出比赛图(忽略轮数)