比赛配对问题 | 青训营创作笔记

45 阅读2分钟

问题描述

image.png

解题思路: 问题理解

你需要计算从 n 支队伍开始,直到决出唯一获胜队伍为止,总共进行的配对次数。每次配对都会减少队伍的数量,直到只剩下一个队伍。

关键点
偶数队伍:每轮配对后,队伍数量减半。
奇数队伍:随机轮空一支队伍,其余队伍配对,队伍数量减少一半多一个。
解题思路
初始条件:如果 n 为 1,直接返回 0,因为不需要任何配对。
递归或迭代:
如果 n 是偶数,配对次数为 n / 2,剩余队伍数为 n / 2。
如果 n 是奇数,配对次数为 (n - 1) / 2,剩余队伍数为 (n - 1) / 2 + 1。
累加配对次数:每次递归或迭代时,累加当前的配对次数,直到队伍数变为 1。

#include <iostream>
#include <vector>
#include <string>
 
using namespace std;
 
int solution(int n) {
    // 如果只有一支队伍,不需要配对
    if (n == 1) return 0;
    
    int pairs = 0;  // 初始化配对次数
    
    // 循环直到队伍数变为1
    while (n > 1) {
        if (n % 2 == 0) {
            // 偶数队伍的处理
            pairs += n / 2;  // 当前轮次的配对次数
            n /= 2;  // 剩余队伍数减半
        } else {
            // 奇数队伍的处理
            pairs += (n - 1) / 2;  // 当前轮次的配对次数
            n = (n - 1) / 2 + 1;  // 剩余队伍数减半多一个
        }
    }
    
    return pairs;  // 返回总的配对次数
}
 
int main() {
    cout << (solution(7) == 6) << endl;
    cout << (solution(14) == 13) << endl;
    cout << (solution(1) == 0) << endl;
 
    return 0;
}

总结:

  1. 需求分析
  • 明确要解决的问题或要实现的功能。
  1. 设计
  • 规划软件的架构和模块。 - 设计数据结构和算法。
  1. 编码
  • 使用选定的编程语言实现设计方案。 - 遵循良好的编程规范,提高代码的可读性和可维护性。
  1. 测试
  • 进行单元测试、集成测试、系统测试等,确保程序的正确性和稳定性。 - 发现并修复代码中的错误和漏洞。