CodeForces 3D Least Cost Bracket Sequence

来源:互联网 发布:光辉岁月 知乎 编辑:程序博客网 时间:2024/05/17 04:55

经典的贪心题目,解决问题的方法很值得深思,值得收藏~~


#include <cmath>#include <cstdio>#include <cstdlib>#include <cstring>#include <queue>#include <iostream>#include <algorithm>using namespace std;const int MAXN = 55555;char str[MAXN];struct Node{    int val, id;    Node() {}    Node(int t_val, int t_id) : val(t_val), id(t_id) {}    friend bool operator < (const Node &p1, const Node &p2)    {        return  p1.val < p2.val;    }};priority_queue<Node> que;int main(){    //freopen("aa.in", "r", stdin);    //freopen("bb.out", "w", stdout);    int a, b; Node t;    long long ans = 0; int cnt = 0;    scanf("%s", str); int len = strlen(str);    for(int i = 0; i < len; ++i)    {        if(str[i] == '(')        {            cnt++;        }        else if(str[i] == ')')        {            cnt--;        }        else if(str[i] == '?')        {            cin >> a >> b;            cnt--;            str[i] = ')';            ans += b; que.push(Node(b - a, i));        }        if(cnt < 0)             //对当前右括号的数目大于左括号数目的情况,利用优先队列中的右括号进行消去        {            if(que.empty())     //非法的情况                break;            t = que.top(); que.pop();            ans -= t.val; cnt += 2; str[t.id] = '(';        }    }    if(cnt != 0)        cout << "-1" << endl;    else    {        cout << ans << endl;        for(int i = 0; i < len; ++i)        {            cout << str[i];        }    }    cout << endl;    return 0;}