CodeForces 847C Sum of Nestings

CodeForces 847C Sum of Nestings

题目

http://codeforces.com/problemset/problem/847/C

题意

给你n,k两个数,说有n对括号,要求输出有k个嵌套的括号。
比如“( ( ( () ) ) )”嵌套数就是6.分别是1( () ) +2( ( () ) )+3( ( ( () ) ) )

题解

我们很容易发现规律,有n对括号,那么最多嵌套数sum[i]就等于sum[i-1]+i-1。
他是这样的一个数列:0 1 3 6 10 15……
然后我们先判断k是否大于sum[i]。大于就直接输出Impossible
否则先找到小于等于k的最大嵌套数。然后再在嵌套的括号里面加括号。
规律:
在最外面加括号贡献为0,然后越往里面加括号,贡献越大。

代码

#include<iostream>
using namespace std;
#define ll long long
const int maxn = 3e5+10;
ll a[maxn];
int main()
{
	a[1] = 0;
	for(int i=2;i<=3e5;i++)
		a[i] = a[i-1]+i-1;
	int n;
	ll k;
	scanf("%d %lld",&n,&k);
	if(k > a[n])
	{
		puts("Impossible");
		return 0;
	}
	int index=0;
	for(index=n;index>=0;index--)
	{
		if(a[index]<=k)
			break;
	}
	ll ans = k - a[index];
	for(int i=0;i<index;i++)
	{
		printf("(");
	}
	for(int i=index-1;i>=0;i--)
	{
		printf(")");
		if(ans == i&&index<n)
		{
			index++;
			printf("()");
		}
			
	}
	for(int i = index;i<n;i++)
	{
		printf("()");
	}
	puts("");
	return 0;
}
发布了51 篇原创文章 · 获赞 16 · 访问量 3366

猜你喜欢

转载自blog.csdn.net/weixin_43911945/article/details/99694083