2021牛客寒假算法基础集训营1 B.括号(构造)

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值