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;
    }
  • 相关阅读:
    Java中常见的异常
    WebView中Js与Android本地函数的相互调用
    Gson解析POJO类中的泛型参数
    JAVA反射技术的使用
    Couchbase 找回登录密码
    微信内网页支付开发手记
    Android实现自定义字体
    Android实现图片裁切
    Android实现ExpandableTextView可扩展TextView
    仿美团实现地域选择(二)
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5266725.html
Copyright © 2011-2022 走看看