zoukankan      html  css  js  c++  java
  • Codeforces Beta Round #3 D. Least Cost Bracket Sequence 优先队列

    D. Least Cost Bracket Sequence

    题目连接:

    http://www.codeforces.com/contest/3/problem/D

    Description

    This is yet another problem on regular bracket sequences.

    A bracket sequence is called regular, if by inserting "+" and "1" into it we get a correct mathematical expression. For example, sequences "(())()", "()" and "(()(()))" are regular, while ")(", "(()" and "(()))(" are not. You have a pattern of a bracket sequence that consists of characters "(", ")" and "?". You have to replace each character "?" with a bracket so, that you get a regular bracket sequence.

    For each character "?" the cost of its replacement with "(" and ")" is given. Among all the possible variants your should choose the cheapest.

    Input

    The first line contains a non-empty pattern of even length, consisting of characters "(", ")" and "?". Its length doesn't exceed 5·104. Then there follow m lines, where m is the number of characters "?" in the pattern. Each line contains two integer numbers ai and bi (1 ≤ ai,  bi ≤ 106), where ai is the cost of replacing the i-th character "?" with an opening bracket, and bi — with a closing one.

    Output

    Print the cost of the optimal regular bracket sequence in the first line, and the required sequence in the second.

    Print -1, if there is no answer. If the answer is not unique, print any of them.

    Sample Input

    (??)
    1 2
    2 8

    Sample Output

    4
    ()()

    Hint

    题意

    给你一个括号序列

    有问号的地方给你把该问号变成左括号或者右括号的代价。

    然后问你最少多少花费可以使得这个序列变得合法。

    如果不能的话,输出-1.

    题解:

    直接暴力扫一遍。

    先把全部问号变成右括号,如果当前这个位置的括号值小于0的话,就把y-x最大的那个位置变回左括号就好了。

    用一个优先队列维护就好了。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    priority_queue<pair<long long,int> >Q;
    string s;
    int main()
    {
        cin>>s;
        if(s.size()%2==1)return puts("-1"),0;
        int now=0;
        long long ans=0;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]=='(')
                now++;
            else if(s[i]==')')
                now--;
            else
            {
                int x,y;scanf("%d%d",&x,&y);
                now--;s[i]=')';ans+=y;
                Q.push(make_pair(y-x,i));
            }
            if(now<0)
            {
                if(Q.size()==0)break;
                pair<int,int> a = Q.top();Q.pop();
                ans-=a.first;s[a.second]='(';
                now+=2;
            }
        }
        if(now!=0)return puts("-1"),0;
        cout<<ans<<endl;
        cout<<s<<endl;
    }
  • 相关阅读:
    927小程序繁星计划峰会 · 看完这七大话题 你会更了解阿里小程序
    不吹不黑,今天我们来聊一聊 Kubernetes 落地的三种方式
    虽然他们说是水题,但我觉得思想蛮好的
    新学dfs(看懂了)
    01背包,死记硬背(我是真的蠢)
    装箱问题(太笨、还没想通)
    高精度乘法,string中的坑
    双十一用python秒杀京东好货!
    高精度减法用string 和 stack
    n阶汉诺塔 记住吧。。
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5266725.html
Copyright © 2011-2022 走看看