【HDU 6299】Balanced Sequence

【链接】 我是链接,点我呀:)
【题意】


在这里输入题意

【题解】


我们贪心地把每一个括号序列能匹配都按照栈的规则都匹配出来。
(直接递增匹配对数*2就可以了
最后栈里面就只剩下类似))))(((((((这样的形式了。
现在就相当于有很多个这种字符串了。
让你把它们拼接在一起。
可以用sort贪心一下。
优先把(多的序列放在前面一点。
具体的比较函数这么写
里注释的括号用于参考
(实在不知道原理,就一种一种猜吧。。。。
sort完之后再模拟一下括号匹配就好

    bool operator < (const abc &b) const{

        //))))((((( (((((
        if (left_brackets>right_brackets){
            //))((((((((((((((
            if (b.left_brackets>b.right_brackets)
                    return right_brackets<b.right_brackets;//都是左括号比较少。那么就右括号少一点的放左边。
            else //b.left<=b.right
            //))))))))))((
                return true;//看上去右括号那么多,就放后面一点吧。。多一点匹配数。
        }else{

        //)))))))))))(((
            //left_brackets<=right_brackets
            if (b.left_brackets<=b.right_brackets){ //都是右括号比较多。就让他少祸害一点。让左括号多的放左边.
                //))))))))))))))((
                return left_brackets>b.left_brackets;
            }else{
              //)))))((((((((((((((
                return false; //如果这个左括号那么多的话,就放左边去吧。
            }
        }
    }

【代码】

#include <bits/stdc++.h>
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define all(x) x.begin(),x.end()
#define pb push_back
#define lson l,mid,rt<<1
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define res(x) scanf("%s",x)
#define rson mid+1,r,rt<<1|1
using namespace std;

const double pi = acos(-1);
const int dx[4] = {0,0,1,-1};
const int dy[4] = {1,-1,0,0};
const int N = 1e5;

struct abc{
    int right_brackets,left_brackets;
    //))))))))((
    //))(((((((((((
    bool operator < (const abc &b) const{

        //))))((((( (((((
        if (left_brackets>right_brackets){
            //))((((((((((((((
            if (b.left_brackets>b.right_brackets)
                    return right_brackets<b.right_brackets;
            else //b.left<=b.right
            //))))))))))((
                return true;
        }else{

        //)))))))))))(((
            //left_brackets<=right_brackets
            if (b.left_brackets<=b.right_brackets){
                //))))))))))))))((
                return left_brackets>b.left_brackets;
            }else{
                return false;
            }
        }
    }
}a[N+10];

int n;
char s[N+10];
int sta[N+10];

int main(){
    #ifdef LOCAL_DEFINE
        freopen("rush_in.txt", "r", stdin);
    #endif
    int T;
    rei(T);
    while(T--){
        long long ans = 0;
        rei(n);
        for (int i = 1;i <= n;i++){
            a[i].left_brackets = a[i].right_brackets = 0;
            res(s);
            int len = strlen(s);
            int top = 0;
            for (int j = 0;j < len;j++)
                if (s[j]==')'){
                    if (top>0 && sta[top]==0){
                        top--;
                        ans+=2;
                    }else
                        sta[++top] = 1;
                }else{
                    sta[++top] = 0;
                }
            rep1(j,1,top)
                if (sta[j]==1)
                    a[i].right_brackets++;
                else
                    a[i].left_brackets++;
        }
        sort(a+1,a+1+n);
        int now = 0;
        rep1(i,1,n){
            int temp = min(now,a[i].right_brackets);
            now-=temp;
            ans+=(temp*2);
            now+=a[i].left_brackets;
        }
        printf("%lld\n",ans);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/AWCXV/p/9362439.html