假设我们有n支球队,并且我们总是安排实力较强的球队与实力较弱的球队比赛,例如让排名1的球队与实力排名第n的球队比赛,这种策略是使比赛更加有趣。现在,我们必须以字符串形式查找他们的最终比赛。
这些团队以从1到n的正整数的形式给出,代表他们的初始排名。因此,排名1是最强的团队,排名n是最弱的团队。我们将使用括号和逗号来表示竞赛团队的配对-括号('(',')')用于配对,逗号(',')用于分区。在每一轮的配对过程中,我们始终必须遵循将强壮的一对与弱壮的一对配对的策略。
因此,如果输入类似于4,那么输出将为((1,4),(2,3))
为了解决这个问题,我们将遵循以下步骤-
定义一个函数create()
,将使用低,高,数组v2,数组v1,
如果低> =高,则-
返回
在v2的末尾插入“(” concatenate v1 [low] concatenate“,” concatenate v1 [high] concatenate“)
创建(低+ 1,高-1,v2,v1)
从主要方法中执行以下操作-
定义数组v1,v2
对于初始化i:= 1,当i <= n时,更新(将i增加1),-
插入将我转换为v1末尾的字符串
当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))