题意:找到能够使组成'(' ')'个数的排列,不同行可以组合
先把能自己组成“()”的去掉
所以也就只剩下下面几类
( ( ( ( (
) ) ) ) )
) ( ( ( (
) ) ) ) (
关键在于把这些排序好就可以了
让'('多的在左边 ')'多的在右边
#include<bits/stdc++.h>
using namespace std;
struct pp{
int l,r;
}a[100005];
int cmp(struct pp a,struct pp b){
if(a.r>=a.l&&b.r<b.l)
return 0;
if(a.r<a.l&&b.r>=b.l)
return 1;
if(a.r>=a.l&&b.r>=b.l)
return a.l>b.l;
return a.r<b.r;
}
char s[100005];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
int ans=0;
memset(s,'\0',sizeof(s));
for(int i=1;i<=n;i++){
scanf("%s",s);
a[i].l=a[i].r=0;
for(int j=0;s[j] != '\0';j++){
if(s[j]=='('){
a[i].l++;
}
else{
if(a[i].l){
ans++;
a[i].l--;
}
else{
a[i].r++;
}
}
}
}
sort(a+1,a+1+n,cmp);
int x=0;
for(int i=1;i<=n;i++){
if(x<=a[i].r){
ans+=x;
x=a[i].l;
continue;
}
ans+=a[i].r;
x-=a[i].r;
x+=a[i].l;
}
printf("%d\n",ans*2);
}
}