C++ 输出比赛匹配结果


假设我们有 n 支队伍,我们总是安排实力较强的队伍与实力较弱的队伍比赛,例如让排名第 1 的队伍与排名第 n 的队伍比赛,这种策略是为了使比赛更有趣。现在我们必须找到他们最终的比赛匹配结果,并以字符串的形式表示。

这些队伍以 1 到 n 的正整数形式给出,表示它们的初始排名。因此,排名第 1 的队伍是最强的队伍,排名第 n 的队伍是最弱的队伍。我们将使用括号和逗号来表示比赛队伍配对 - 括号 ('(', ')') 用于配对,逗号 (',') 用于分隔。在每一轮的配对过程中,我们始终必须遵循让实力较强的队伍与实力较弱的队伍配对的策略。

因此,如果输入为 4,则输出将为 ((1,4), (2,3))

为了解决这个问题,我们将遵循以下步骤:

  • 定义一个函数 create(),它将接收 low、high、数组 v2、数组 v1 作为参数。

  • 如果 low >= high,则:

    • 返回

  • 在 v2 的末尾插入 "(" 连接 v1[low] 连接 ", " 连接 v1[high] 连接 ")"

  • 调用 create(low + 1, high - 1, v2, v1)

  • 在主方法中执行以下操作:

  • 定义数组 v1、v2

  • 初始化 i := 1,当 i <= n 时,更新 (i 增加 1),执行:

    • 在 v1 的末尾插入将 i 转换为字符串的结果

  • 当 v1 的大小 > 1 时,执行:

    • 调用 create(0, v1 的大小, v2, v1)

    • v1 := v2

    • 清空 v2 数组

  • 返回 v1 的最后一个元素

示例

让我们看看以下实现,以便更好地理解:

 实时演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   void create(int low, int high, vector <string>& v2, vector <string>& v1){
      if (low >= high)
         return;
      v2.push_back("(" + v1[low] + "," + v1[high] + ")");
      create(low + 1, high - 1, v2, v1);
   }
   string findContestMatch(int n) {
      vector v1, v2;
      for (int i = 1; i <= n; i++) {
         v1.push_back(to_string(i));
      }
      while (v1.size() > 1) {
         create(0, v1.size() - 1, v2, v1);
         v1 = v2;
         v2.clear();
      }
      return v1.back();
   }
};
main(){
   Solution ob;
   cout << (ob.findContestMatch(4));
}

输入

4

输出

((1,4),(2,3))

更新于: 2020年11月16日

144 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告