HDU 6299 Balanced Sequence 【贪心】

Balanced Sequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2182    Accepted Submission(s): 537


 

Problem Description

Chiaki has n strings s1,s2,…,sn consisting of '(' and ')'. A string of this type is said to be balanced:

+ if it is the empty string
+ if A and B are balanced, AB is balanced,
+ if A is balanced, (A) is balanced.

Chiaki can reorder the strings and then concatenate them get a new string t . Let f(t) be the length of the longest balanced subsequence (not necessary continuous) of t . Chiaki would like to know the maximum value of f(t) for all possible t .

 

Input

There are multiple test cases. The first line of input contains an integer T , indicating the number of test cases. For each test case:
The first line contains an integer n (1≤n≤105 ) -- the number of strings.
Each of the next n lines contains a string si (1≤|si|≤105 ) consisting of `(' and `)'.
It is guaranteed that the sum of all |si| does not exceeds 5×106 .

 

Output

For each test case, output an integer denoting the answer.

 

Sample Input

 

2 1 )()(()( 2 ) )(

 

Sample Output

 

4 2

难点在于排序,这里我参考了蔡队的博客:

http://cubercsl.cn/wiki/2018-HDU-1/

他都不会证明那我必然不会啊;

#include<bits/stdc++.h>
using namespace std;
const int MAX = 1e6;
#define l first
#define r second
pair <int, int> p[MAX];
char a[MAX], s[MAX];
bool cmp(pair <int, int> &a, pair <int, int> &b){
    int x = min(a.l, b.r);
    int y = min(a.r, b.l);
    return x > y || x == y && a.l > b.l;
}
int main(){
    int N;
    for(scanf("%d", &N); N; N--){
        int n;
        scanf("%d", &n);
        int ans = 0;
        for(int i = 1; i <= n; i++){
            scanf("%s", s);
            int len = strlen(s);
            int flag = 0;
            for(int j = 0; j < len; j++){
                if(s[j] == ')' && flag && a[flag] == '('){
                    ans++;
                    flag--;
                }
                else
                    a[++flag] = s[j];
            }
            p[i].l = p[i].r = 0;
            for(int j = 1; j <= flag; j++){
                if(a[j] == '(')
                    p[i].l++;
                else
                    p[i].r++;
            }
        }
        sort(p + 1, p + 1 + n, cmp);
        int num = 0;
        for(int i = 2; i <= n; i++){
            num += p[i - 1].l;
            if(p[i].r > num){
                ans += num;
                num = 0;
            }
            else{
                ans += p[i].r;
                num -= p[i].r;
            }
        }
        printf("%d\n", ans * 2);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Head_Hard/article/details/81184327