1170: 修括号
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 4 Solved: 3
[ Submit][ Status][ Web Board]
Description
给你一个长度为2*n(n<=20000)的括号序列,问你至少修改(如左括号变成右括号)多少个可以使这个括号序列合法
Input
第一行一个正整数t(t<=100),表示数据组数。
对于每组数据,读入为一行长度为偶数的只含括号的序列。
Output
输出最少修改的次数。
每组数据占一行。
Sample Input
6(((()))))(((()(())((((((()()(((((()))())())))()(()
Sample Output
140403
HINT
对于第一组数据,可以修改第2个括号。
对于第二组数据,可以修改第1个,第3个,第4个,第6个。
对于第三组数据,合法,无需修改。
对于第四组数据,可以修改第2个,第4个,第6个,第12个。
对于第五组数据,合法,无需修改。
对于第六组数据,可以修改第3个,第5个,第8个。
思路:先对把组成的删去,最后应该是a个)加b个(的形式,ans+=a/2+b/2;如果ab都为奇数,那么ans+2。
AC代码如下:
#include<cstdio>
#include<cstring>
using namespace std;
int num[40010];
char s[40010];
int main()
{ int t,i,j,k,pos,a,b,ans;
scanf("%d",&t);
while(t--)
{ scanf("%s",s);
k=strlen(s);
pos=0;
for(i=0;i<k;i++)
{ if(s[i]=='(')
{ num[++pos]=-1;
}
else
{ if(num[pos]==-1)
pos--;
else
num[++pos]=1;
}
}
a=0;b=0;ans=0;
for(i=1;i<=pos;i++)
if(num[i]==-1)
a++;
else
b++;
ans+=a/2+b/2;
a%=2;
b%=2;
if(a+b==2)
ans+=2;
printf("%d\n",ans);
}
}