B.括号
题目链接:https://ac.nowcoder.com/acm/contest/9981/B
题目描述:
请你构造一个非空的括号字符串,包含正好 k 个不同合法括号对。所谓括号字符串,是指由’(‘和’)'这两种字符构成的字符串。要求构造的字符串长度不超过100000。
输入描述:
一个整数 k。
0 ≤ k ≤ 10^9
输出描述:
一个仅包含左右括号字符串,其中有 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
输出
()))))))))
说明
合法的还可以是:
())())()
((()))
)()()())(
等等等。有非常多种合法构造,输出任意即可。
解题思路:
构造
当k = 2 时,()) / (()
当k = 3 时,())) / ((() / ()()
每个左括号右边有多少个右括号,加起来要为k。可以先画一堆右括号,之后再在合适的位置添加左括号,要注意构造的串的长度不能超过100000,k ≤ 10^9。
接下来可以考虑先画50000个右括号(在左边填左括号)计算左括号位置,放a个在最左边:a = k / 50000 。零头部分用一个括号即可,位置在右数第k % 50000个右括号的左边放一个左括号。
若想使左右括号的个数尽量均匀,可以先画 L√a」( Lx」表示向下取整 )个右括号, k / L√a」个左括号在最左边,再用一个零头部分凑上,即右数第 k % ( k / L√a」) 个右括号的左边放一个左括号。
代码如下:
C++
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main(){
int k;
cin>>k;
int a=k/50000;
for(int i=1;i<=a;i++)
cout<<"(";
int b=k%50000;
for(int i=50000;i>=1;i--){
if(i == b)cout<<"(";
cout<<")";
}
return 0;
}