hdu 6299 - xjb贪心

题目链接:点击这里

解题思路:

先把每个字符串消成))(((这样的情况,也就时该消的都消掉之后肯定最后剩下不能消的。

然后两个字符串谁排在后面谁排前面看哪个顺序抵消的括号数多久按哪个顺序。不会证明。。。。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstdio>
#include<cmath>
#include<set>
#include<map>
#include<cstdlib>
#include<ctime>
#include<stack>
#include<bitset>
using namespace std;
typedef long long int ll;
const ll inf = 0x3f3f3f3f;
const int mx = 1e5+5;
char s[mx];
int n,m;
int pre[mx];
int suf[mx];
struct node
{
    ll L,R;
}a[mx];
bool cmp1(node A,node B)
{
    int x = min(A.L,B.R),y = min(A.R,B.L);
    return x > y || (x==y&&A.L>B.L);
}
int find()
{
    int l = a[1].L,ans = 0;
    for(int i=2;i<=n;i++)
    {
        if(a[i].R>=l) ans += l*2,l = a[i].L;
        else ans += a[i].R*2,l += a[i].L - a[i].R;
    }
    return ans;
}
int main(){
    int t,q,ca = 1;
    scanf("%d",&t);
    while(t--){
        scanf("%d", &n);
        int sum1 = 0,sum2 = 0;
        int sum = 0;
        int len = 0,ans = 0;
        for(int i = 1; i <= n; i++){
            scanf("%s", s);
            int l = 0, r = 0;
            for(int j = 0; s[j]; j++){
                if(s[j] == '(')l++;
                else{
                    if(l)l--,sum += 2;
                    else r++;
                }
            }
            a[i].L = l;
            a[i].R = r;
        }
        sort(a+1,a+1+n,cmp1); 
        ans = max(ans,sum+find());
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/a1214034447/article/details/81430053