2019 计蒜之道 复赛 撑起信息安全“保护伞” 贪心

题目链接:https://nanti.jisuanke.com/t/39615

题解:两种都从后往前,l记录左括号的数量,r记录右括号数量,找前驱时,要满足第一个符合的s[i]==')' && r>=l && l>0,然后前面的直接输出,先把多余的右括号输出,剩下相等的左右括号一块输出,找后驱要找第一个符合s[i]=='(' && r-1>=l,先输出一个右括号,然后吧左括号都输出,在把右括号都输出。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
char s[N];
int main()
{
	while(~scanf("%s",s))
	{
		int len=strlen(s);
		int l,r;
		l=r=0;
		for(int i=len-1;i>=0;i--)
		{
			if(s[i]==')') r++;
			else l++;
			if(s[i]==')' && r>=l && l)
			{
	//			cout<<i<<endl;
				for(int j=0;j<i;j++)
					printf("%c",s[j]);
				printf("(");
				l--;
				while(l!=r)
				{
					printf(")");
					r--;
				}
				while(l&&r)
				{
					printf("()");
					l--,r--;
				}
				break;
			}
		}
		printf("\n");
		l=r=0;
		for(int i=len-1;i>=0;i--)
		{
			if(s[i]==')')r++;
			else l++;
			if(s[i]=='(' && r-1>=l)
			{
				for(int j=0;j<i;j++)
					printf("%c",s[j]);
				printf(")");
				r--;
				while(l)
				{
					printf("(");
					l--;
				}
				while(r--) printf(")");
				break;
			}
		}
		printf("\n");
	}
	return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值