zoukankan      html  css  js  c++  java
  • Balanced Sequence

    PS:贪心,先拿两个试一下,找到了。。。错误的排序方式,于是百度了两种做法。

    (1)按照一个串的贡献进行排序,每次优先处理两个贡献大的串,然后用优先队列动态的对每次剩下的串排序。

    //#include<bits/stdc++.h>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<bitset>
    #include<vector>
    #include<queue>
    #include<set>
    #define ll long long
    #define P pair<int, int>
    #define PP pair<int,pair<int, int>>
    #define pb push_back
    #define pp pop_back
    #define lson root << 1
    #define INF (int)2e9 + 7
    #define rson root << 1 | 1
    #define LINF (unsigned long long int)1e18
    #define mem(arry, in) memset(arry, in, sizeof(arry))
    using namespace std;
    
    const int N = 1e5 + 5;
    
    struct node {
        int l, r;
        bool operator < (const node& i) const {
            return min(l, r) < min(i.l, i.r);
        }
    }a[N];
    
    int n, T;
    
    int main()
    {
        cin >> T;
        while(T--) {
            cin >> n;
            vector<string> S(n + 1);
    
            for(int i = 1; i <= n; i++) {
                char buf[N];
                scanf("%s", buf);
                S[i] = buf;
            }
    
            priority_queue<node> q;
    
            int sum = 0;
            for(int i = 1; i <= n; i++) {
                int mx = 0, d = 0;
                for(auto c : S[i]) {
                    d += (c == '(' ? 1 : -1);
                    if(d < mx) mx = d;
                }
                a[i].l = -mx;
                a[i].r = d - mx;
                sum += (int)S[i].size() - d + 2 * mx;
                q.push(a[i]);
            }
    
            node z;
            while(q.size() > 1) {
                node x = q.top(); q.pop();
                node y = q.top(); q.pop();
    
                if(min(y.r, x.l) > min(y.l, x.r)) swap(x.l, y.l), swap(x.r, y.r);
    
                int tp = min(x.r, y.l);
                sum += 2 * tp;
                if(x.r >= y.l) {
                    z.l = x.l;
                    z.r = y.r + (x.r - y.l);
                }
                else {
                    z.l = x.l + y.l - x.r;
                    z.r = y.r;
                }
                q.push(z);
            }
    
            printf("%d
    ", sum);
        }
        return 0;
    }
    View Code

    (2)两个串,4种情况,确定好排序方式就好做了。分类讨论不重不漏,要不然可能会哭。注意不要瞎加等号,本人wa了一下午!!!!!!

    if(l <= r && i.l <= i.r) return l < i.l;
    if(l <= r && i.l > i.r) return true;
    if(l > r && i.l > i.r) return r > i.r;
    if(l > r && i.l <= i.r) return false;
    //#include<bits/stdc++.h>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<bitset>
    #include<vector>
    #include<queue>
    #include<set>
    #define ll long long
    #define P pair<int, int>
    #define PP pair<int,pair<int, int>>
    #define pb push_back
    #define pp pop_back
    #define lson root << 1
    #define INF (int)2e9 + 7
    #define rson root << 1 | 1
    #define LINF (unsigned long long int)1e18
    #define mem(arry, in) memset(arry, in, sizeof(arry))
    using namespace std;
    
    const int N = 1e5 + 5;
    
    int n, T;
    
    struct node {
        int l, r;
        bool operator < (const node& i) const {
            if(l <= r && i.l <= i.r) return l < i.l;
            if(l <= r && i.l > i.r) return true;
            if(l > r && i.l > i.r) return r > i.r;
            if(l > r && i.l <= i.r) return false;
        }
    }a[N];
    
    int main()
    {
        cin >> T;
        while(T--) {
            cin >> n;
            vector<string> S(n + 1);
    
            for(int i = 1; i <= n; i++) {
                char buf[N];
                scanf("%s", buf);
                S[i] = buf;
            }
    
            int sum = 0;
            for(int i = 1; i <= n; i++) {
                int mx = 0, d = 0;
                for(auto &&c : S[i]) {
                    d += (c == '(' ? 1 : -1);
                    if(d < mx) mx = d;
                }
                a[i].l = -mx;
                a[i].r = d - mx;
                sum += (int)S[i].size() - d + 2 * mx;
            }
    
            sort(a + 1, a + n + 1);
            for(int i = 1; i < n; i++) {
                int tp = min(a[i].r, a[i + 1].l);
                sum += 2 * tp;
                if(a[i].r > a[i + 1].l) a[i + 1].r += a[i].r - a[i + 1].l;
            }
    
            printf("%d
    ", sum);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Brackets 前端编辑器试用
    java面试题之第一回
    java数据类型
    [转]JAVA标识符和关键字
    Servlet的几个关键知识点
    一个Servlet中可以有多个处理请求的方法
    基于java的聊天室/群发控制台程序
    java 创建string对象机制 字符串缓冲池 字符串拼接机制
    git 常用命令
    ajax axios 下载文件时如何获取进度条 process
  • 原文地址:https://www.cnblogs.com/zgglj-com/p/9373970.html
Copyright © 2011-2022 走看看