链接:http://lintcode.com/zh-cn/problem/output-contest-matches/
在NBA季后赛期间,我们总是安排一支实力相当强的球队去和实力较弱的球队比赛,比如让排名第一的球队和第n队一起比赛,这是一个让比赛更有趣的好策略。现在,你得到了n个团队,你需要以字符串的形式输出他们的最终比赛。
n
组以正整数的形式给出,从1到n,表示它们的初始排名。(排名第一的是实力最强的球队,排名n最弱的球队。)我们将使用括号('(',')')和逗号(',')来表示比赛团队的配对-括号('(',')')用于对分区的配对和逗号(',')。在每一轮的配对过程中,你总是需要遵循一种策略,那就是让一个相当强的一对和一个相当弱的配对。
注意事项
- The
n
is in range[2, 2^12]
. - We ensure that the input
n
can be converted into the form2^k
, where k is a positive integer.
样例
给定 n = 2
, 返回 "(1,2)"
.
解释:
一开始,我们有队1和队2,位置是:1,2。
然后我们将团队(1,2)和‘(’、‘)’和‘,’组合在一起,这是最终的答案。
给定 n = 4
, 返回 "((1,4),(2,3))"
解释:
在第一轮中,我们将球队1和4,2和3组合在一起,因为我们需要把强大的队伍和弱队放在一起。
和我们有(1、4)(2、3)。
在第二轮中,(1,4)和(2,3)的获胜者需要再次发挥,以产生最终的胜利者,所以你需要在他们的外面加上括号。
我们得到了最终答案((1,4),(2,3))
给定 n = 8
, 返回 "(((1,8),(4,5)),((2,7),(3,6)))"
.
解释:
第一轮: (1,8),(2,7),(3,6),(4,5)
第二轮: ((1,8),(4,5)),((2,7),(3,6))
第三轮: (((1,8),(4,5)),((2,7),(3,6)))
由于第三轮将产生最终的赢家,您需要输出答案(((1,8),(4,5)),((2,7),(3,6)))。
class Solution {
public:
/**
* @param n: a integer, denote the number of teams
* @return: a string
*/
string findContestMatch(int n) {
// write your code here
vector<string> res;
for(int i=1;i<=n;i++)
{
res.push_back(to_string(i));
}
while(res.size()>1)
{
vector<string> tmp;
for(int i=0;i<res.size()/2;i++)
{
tmp.push_back("("+res[i]+","+res[res.size()-1-i]+")");
}
res=tmp;
}
return res[0];
}
};