括号

链接:https://ac.nowcoder.com/acm/contest/9981/B
来源:牛客网

题目描述
请你构造一个非空的括号字符串,包含正好 kk 个不同合法括号对。
所谓括号字符串,是指由’(‘和’)'这两种字符构成的字符串。
要求构造的字符串长度不超过100000。
输入描述:
一个整数 k。
0≤k≤10^9

输出描述:
一个仅包含左右括号字符串,其中有 kk 个合法的括号对。如果有多种构造方法,输出任意一种合法方案即可。

示例1
输入
3
输出
()()
说明
假设字符串数组下标从 1 开始,则 (1,2), (1,4), (3,4) 共计 3 个合法括号对
当然,"()))" 也是一种合法的构造

示例2
输入
4
输出
(())
说明
假设字符串数组下标从 1 开始,则 (1,3), (1,4), (2,3), (2,4) 共计 4 个合法括号对
另外,合法的构造还有"())()"、"()(()(" 等等。。

示例3
输入
9
输出
()))))))))
说明
合法的还可以是:
())())()
((()))
)())()()()(
等等等。。有非常多种合法构造,输出任意即可。

思路:
字符长度为10^5,
也就是说最多可以表示2.5*10^9个字符,
然后就发现不用保持最理想的状态,范围有余地。
我开始就试了只用一个平方表示,比如8可以换算成2 * 2 + 4也就是表示为“())))()”,然后样例只过了83%。我就开始思考是不是范围太小了,我就加了一个平方,8 = 2 * 2 + 2 * 2表示为“(())))”,其实还可以继续分,用数组储存,输出会更加简洁。

括号和等式的关系:
8 = 2 * 2 + 1 * 4;“())))()”
*号前面代表的是“(”,在第几个‘(’后面要加‘)’;
*号后面代表的是“)”,在要加’)‘的’('后面要加的数目;

C语言代码:
s是第一次开方,p是第二次,所有的数都可以表示为 n = 1 * d + p * p + s * s,也就是
“( )*d (*p-1 )*p (*s-p-1 )*s”字母是个数。

#include<stdio.h>
#include<math.h>

int main()
{
	double n;
	long long d, s, p;
	scanf("%lf", &n);
	if(n==0)
		printf("(");
	else
	{
		s = (int)sqrt(n);
		d = n-s*s;
		p = (int)sqrt(d);
		d = d-p*p;
		printf("(");
		for(int i=1; i<=d; i++)
			printf(")");
		for(int i=2; i<=p; i++)
			printf("(");
		for(int i=1; i<=p; i++)
			printf(")");
		if(!p) p++;
		for(int i=p+1; i<=s; i++)
			printf("(");
		for(int i=1; i<=s; i++)
			printf(")");
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值