【HDU 6299】Balanced Sequence

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

在这里输入题意

【题解】

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

<font color = black size = 6> 【代码】</font>
```cpp
#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
",ans);
    }
	return 0;
}

原文地址:https://www.cnblogs.com/AWCXV/p/9362439.html