题目地址
http://acm.hdu.edu.cn/showproblem.php?pid=6299
分四种情况排序,消去一对括号,把’)’的 ‘(’多的放在前面。
重载运算符里面的四种情况后面两种是前面两种的逆向。
一对括号是2,答案乘二。(说实话我没看懂题意为什么chen乘2)
include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
using namespace std;
const int maxn=100005;
struct Node
{
int l,r,sum;
bool operator < (const struct Node &b) const
{
if(l>=r&&b.l<=b.r)
return false;
else if(l<=r&&b.l>=b.r)
return true;
else if(l>=r&&b.l>=b.r)
return r>=b.r;
else if(l<=r&&b.l<=b.r)
return l<=b.l;
}
}node[maxn];
char s[maxn];
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
getchar();
for(int i=0;i<n;i++)
{
scanf("%s",s);
int len = strlen(s);
node[i].l=node[i].r=node[i].sum=0;
for(int j=0;j<len;j++)
{
if(s[j]==')')// l:')'
{
if(node[i].r>0)
{
node[i].r--;
node[i].sum++;
}
else
{
node[i].l++;
}
}
else{
node[i].r++;
}
}
}
sort(node,node+n);
int ans=0; int now=0;//now记录‘(’
for(int i=0;i<n;i++)
{
ans+=node[i].sum;
if(node[i].l>=now)
{
ans+=now;
now=node[i].r;
}
else
{
ans+=node[i].l;
now-=node[i].l;
now+=node[i].r;
}
}
printf("%d\n",ans*2);
}
return 0;
}