解题心得:当没有思路时,枚举所有贪心的策略
l指 指向左边的括号,即右括号 r指 指向右边的括号,即左括号
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
char S[500000];
struct node
{
int l,r;
}data[500000];
int cmp(node a,node b)
{
int x= min(a.l,b.r);
int y = min(a.r,b.l);
return x>y|(x==y&&a.l>b.l);
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n;
scanf("%d",&n);
long long ans = 0;
for(int i=1;i<=n;i++)
{
scanf("%s",S);
int len = strlen(S);
int tmp_l = 0,tmp_r = 0;
for(int j=0;j<len;j++)
{
if(S[j]=='(')
tmp_l++;
else
{
if(tmp_l>0)
{
tmp_l--;
ans++;
}
else tmp_r++;
}
}
//cout<<tmp_l<<" "<<tmp_r<<endl;
data[i].l = tmp_l;
data[i].r = tmp_r;
}
sort(data+1,data+1+n,cmp);
// for(int i=1;i<=n;i++)
// cout<<data[i].l<<" "<<data[i].r<<endl;
int tmp_ll = 0;
for(int i=1;i<n;i++)
{
ans+=min(data[i].l,data[i+1].r);
int o = data[i+1].r-min(data[i].l,data[i+1].r);
ans+=min(o,tmp_ll);
tmp_ll-=min(o,tmp_ll);
tmp_ll = tmp_ll+ data[i].l-min(data[i].l,data[i+1].r);;
}
cout<<ans*2<<endl;
}
return 0;
}