题目描述
请你构造一个非空的括号字符串,包含正好 kk 个不同合法括号对。 所谓括号字符串,是指由’(‘和’)'这两种字符构成的字符串。 要求构造的字符串长度不超过100000100000。
输入描述:
一个整数K,K∈[0,10e9]
输出描述:
一个仅包含左右括号字符串,其中有 k 个合法的括号对。如果有多种构造方法,输出任意一种合法方案即可。
示例1
输入:3
输出:()()
说明:假设字符串数组下标从 1 开始,则 (1,2), (1,4), (3,4) 共计 3 个合法括号对,当然,"()))" 也是一种合法的构造
示例2
输入:4
输出:(())
说明:假设字符串数组下标从 1 开始,则 (1,3), (1,4), (2,3), (2,4) 共计 4 个合法括号对,另外,合法的构造还有"())()"、"()(()(" 等等。。
示例3
输入:9
输出:()))))))))
说明:合法的还可以是:
())())()
((()))
)()()())(
等等等。。有非常多种合法构造,输出任意即可。
代码
//代码是别人写的,我只是捋一捋他的思路
#include <bits/stdc++.h>
using namespace std;
int main(){
int k; cin >> k;
for(int i=1;i<=k/50000;++i){
cout << "(";
}
for(int i=50000;i>=1;--i){
if(i == k%50000){
cout <<"(";
}
cout <<")";
}
return 0;
}
解析
一开始我想的是构造一个类似于((((((()))))))的式子,也就是对于输入k,取其平方根设为a,在a的基础上,在右半边也就是只有))))))的地方插入’(’,来表示出k个。但是事实上问题出现在a*a未必是最接近k的,例如k=31时a=5,理想状况其实是五个’(‘和6个’)’。
这个代码的思路其实是在n个’)‘组成的))))))))))前插入s个’(‘符号,并且在n个’)‘组成的))))))))))中插入’(’,并且默认n=50000。最坏情况下先是n个’(‘再是n个’)’,共计n*n对合法括号对即2500000000对,这个数值大于要求的10e9范围。
整体思路是先表示出sn对括号,再表示出k-sn对括号,k-sn是在右侧一串)))))中距离右侧末尾k-sn个’)‘的位置插入一个’(’,整个操作类似于满十进一这种,只不过这里是满50000时s加1。k<50000可以归为k>50000时的s=0的情况。
k>50000这种不是最坏情况的话可以缩减开头’(‘的个数,比如说3个’(‘和50000个’)'可以表示150000个合法括号对。
k<50000的话,第一个for就没有用了,第二个for会构造出一个长度为50000))…))))()))),它保证距离右侧末尾k个’)‘前有一个’(’,并且根据题意我们知道这个’('前面的’)'是没有实际意义的。