HDU6299 贪心
HDU6299
题意:给n组只包含'('和')'的字符串,求最大的左右括号能匹配的长度
分析:先把所有字符串内能个匹配的左右括号找出来,然后贪心的找出剩下的字符串里面能匹配的个数,怎样才能使匹配的个数最大呢,就是左括号尽量往左放,右括号往右方
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
char s[N];
struct node{
int l, r;
}p[N];
bool cmp(node a, node b){
if(a.l > a.r && b.l > b.r) return a.r < b.r;
//若两个字符串都是左括号多右括号少,就让右括号多的放右边
if(a.l > a.r && b.l <= b.r) return true;
//若一个字符串左括号多右括号少,一个左括号少右括号多,让左括号多的放左边,所以就不需要改变位置
if(a.l <= a.r && b.l > b.r) return false;
//若一个字符串左括号少右括号多,一个左括号多又括号少,让左括号多的放左边,所以就要交换他们的位置
if(a.l <= a.r && b.l <= b.r) return a.l > b.l;
//若两个字符串都是左括号少右括号多,就让左括号多的放左边
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("in.txt", "r", stdin);
#endif // ONLINE_JUDGE
int t, n, l, res, ll, rr, ans;
scanf("%d", &t);
while(t--){
scanf("%d", &n);
ans = 0;
for(int i = 1; i <= n; i++){
scanf("%s", s);
l = 0, res = 0, ll = 0, rr =0;
int len = strlen(s);
for(int j = 0; j < len; j++){
if(s[j] == '('){
l++;
ll++;
}
else{
l--;
rr++;
if(l >= 0) res++;
if(l < 0) l = 0;
}
}
p[i].l = ll - res;
p[i].r = rr - res;
ans += res;
}
sort(p + 1, p + 1 + n, cmp);
int L = 0;
for(int i = 1; i <= n; i++){
int t = min(p[i].r, L);
L += p[i].l - t;
ans += t;
}
printf("%d\n", ans * 2);
}
return 0;
}