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;
    }
  • 相关阅读:
    Objective-C-使用NSMutableURLRequest发送POST请求,使用NSJSONSerialization解析JSON字符串
    js showModalDialog打开新的页面给原页面传值问题
    svn2git使用小记
    模拟等待事件row lock waits
    URAL 1994 The Emperor's plan 求组合数 大数用log+exp处理
    struts总结
    URAL 1992 CVS 链表
    android游戏物理引擎开发——粒子系统(三)
    状态模式与上机
    OpenCV——凸包
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5266725.html
Copyright © 2011-2022 走看看