zoukankan      html  css  js  c++  java
  • HDU6299 贪心

    HDU6299
    题意:给n组只包含'('和')'的字符串,求最大的左右括号能匹配的长度
    分析:先把所有字符串内能个匹配的左右括号找出来,然后贪心的找出剩下的字符串里面能匹配的个数,怎样才能使匹配的个数最大呢,就是左括号尽量往左放,右括号往右方

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 1e5+10;
    char s[N];
    struct node{
        int l, r;
    }p[N];
    bool cmp(node a, node b){
        if(a.l > a.r && b.l > b.r) return a.r < b.r;
        //若两个字符串都是左括号多右括号少,就让右括号多的放右边
        if(a.l > a.r && b.l <= b.r) return true;
        //若一个字符串左括号多右括号少,一个左括号少右括号多,让左括号多的放左边,所以就不需要改变位置
        if(a.l <= a.r && b.l > b.r) return false;
        //若一个字符串左括号少右括号多,一个左括号多又括号少,让左括号多的放左边,所以就要交换他们的位置
        if(a.l <= a.r && b.l <= b.r) return a.l > b.l;
        //若两个字符串都是左括号少右括号多,就让左括号多的放左边
    }
    int main(){
        #ifdef ONLINE_JUDGE
        #else
            freopen("in.txt", "r", stdin);
        #endif // ONLINE_JUDGE
        int t, n, l, res, ll, rr, ans;
        scanf("%d", &t);
        while(t--){
            scanf("%d", &n);
            ans = 0;
            for(int i = 1; i <= n; i++){
                scanf("%s", s);
                l = 0, res = 0, ll = 0, rr =0;
                int len = strlen(s);
                for(int j = 0; j < len; j++){
                    if(s[j] == '('){
                        l++;
                        ll++;
                    }
                    else{
                        l--;
                        rr++;
                        if(l >= 0) res++;
                        if(l < 0) l = 0;
                    }
                }
                p[i].l = ll - res;
                p[i].r = rr - res;
                ans += res;
            }
            sort(p + 1, p + 1 + n, cmp);
            int L = 0;
            for(int i = 1; i <= n; i++){
                int t = min(p[i].r, L);
                L += p[i].l - t;
                ans += t;
            }
            printf("%d
    ", ans * 2);
        }
        return 0;
    }
    
    
  • 相关阅读:
    网络编程
    网络编程
    网络编程
    Java——倒序输出Map集合
    java——assert(断言)方法
    Linux文件列表查询ll和ls区别
    Java——关键字和保留字
    Java——动态创建Class(不写入文件,直接从内存中创建class)
    web项目——启动时tomcat报错:Server Tomcat v7.0 Server at localhost failed to start.
    eclipse——管理远程资源的缓存,例如从Internet下载的资源。
  • 原文地址:https://www.cnblogs.com/kun-/p/10465071.html
Copyright © 2011-2022 走看看