Balanced Sequence(重载运算符+贪心)

题目链接
题目大意:组合n个括号序列,然后求组合后可得到的最长合法子括号序列的长度。

#include <bits/stdc++.h>
using namespace std;

const int MAX = 112345;

struct Node {
    int x, y;
} data[MAX];

bool operator<(const Node &l, const Node &r) {
    if(min(l.x, r.y) > min(l.y, r.x))return 1; //考虑AB还是BA
    if(min(l.x, r.y) < min(l.y, r.x))return 0;   
    return l.y<r.y;                //使右括号少的在前面
}

char str[MAX];

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        int n;
        scanf("%d", &n);
        int ans = 0;
        for (int i = 1; i <= n; i++) {
            scanf(" %s", str);
            stack<char> ss;
            int len = strlen(str);
            for (int j = 0; j < len; j++) {
                if (!ss.empty()) {
                    if (ss.top() == '(' && str[j] == ')') {
                        ss.pop();
                        ans++;
                    } else {
                        ss.push(str[j]);
                    }
                } else ss.push(str[j]);
            }
            int x, y;
            x = y = 0;
            while (!ss.empty()) {
                if (ss.top() == '(') x++;
                else y++;
                ss.pop();
            }
            data[i].x = x;
            data[i].y = y;
        }
        sort(data + 1, data + 1 + n);
        int sum = data[1].x;
        for (int i = 2; i <= n; i++) {
            ans += min(sum, data[i].y);
            sum -= data[i].y;
            sum = max(0, sum);
            sum += data[i].x;
        }
        printf("%d\n", ans * 2);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值