zoukankan      html  css  js  c++  java
  • codeforces 3D . Least Cost Bracket Sequence 贪心

    题目链接

    给一个字符串, 由( ) 以及? 组成, 将?换成( 或者 ) 组成合法的括号序列, 每一个?换成( 或者 ) 的代价都不相同, 问你最小代价是多少, 如果不能满足输出-1.

    弄一个变量num, 如果是( 那么num++,如果是)那么num--。 如果碰到?, 那么先将这个地方弄成), 然后把make_pair(b-a, i)加到一个队列里面。a是换成左括号的值, b是换成右括号的值, i是这个位置的坐标。

    如果遇到num小于0的情况, 那么就将队首元素取出, 将这个位置换成左括号。 如果队列为空, 就是不满足, 直接输出-1。

    #include <iostream>
    #include <vector>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <map>
    #include <set>
    #include <string>
    #include <queue>
    #include <stack>
    #include <bitset>
    using namespace std;
    #define pb(x) push_back(x)
    #define ll long long
    #define mk(x, y) make_pair(x, y)
    #define lson l, m, rt<<1
    #define mem(a) memset(a, 0, sizeof(a))
    #define rson m+1, r, rt<<1|1
    #define mem1(a) memset(a, -1, sizeof(a))
    #define mem2(a) memset(a, 0x3f, sizeof(a))
    #define rep(i, n, a) for(int i = a; i<n; i++)
    #define fi first
    #define se second
    typedef pair<int, int> pll;
    const double PI = acos(-1.0);
    const double eps = 1e-8;
    const int mod = 1e9+7;
    const int inf = 1061109567;
    const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
    string s;
    priority_queue <pll> q;
    int main()
    {
        cin>>s;
        ll ans = 0;
        int a, b, num = 0;
        for(int i = 0; i<s.size(); i++) {
            if(s[i] == '(')
                num++;
            else if(s[i]==')')
                num--;
            else {
                scanf("%d%d", &a, &b);
                ans += b;
                s[i] = ')';
                num--;
                q.push(mk(b-a, i));
            }
            if(num<0) {
                if(q.empty()) {
                    puts("-1");
                    return 0;
                }
                pll tmp = q.top(); q.pop();
                ans -= tmp.first;
                s[tmp.second] = '(';
                num+=2;
            }
        }
        if(num!=0) {
            puts("-1");
            return 0;
        }
        cout<<ans<<endl;
        cout<<s<<endl;
        return 0;
    }
  • 相关阅读:
    C#磁吸屏幕窗体类库
    准备
    我写的诗
    How to turn off a laptop keyboard
    How to tell which commit a tag points to in Git?
    Why should I care about lightweight vs. annotated tags?
    How to get rid of “would clobber existing tag”
    Facebook, Google and Twitter threaten to leave Hong Kong over privacy law changes
    The need for legislative reform on secrecy orders
    Can a foreign key be NULL and/or duplicate?
  • 原文地址:https://www.cnblogs.com/yohaha/p/5273067.html
Copyright © 2011-2022 走看看