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;
    }
  • 相关阅读:
    原生开发、H5开发和混合开发的区别?
    html5:FileAPI 文件操作实战
    web前端是编程语言中更新迭代最快的
    HTTP请求过程
    CSS :placeholder-shown伪类实现Material Design占位符交互效果
    Css中bem书写规范
    全栈开发者意味着什么?
    利用canvas实现转盘抽奖
    12种开源Web安全扫描程序
    移动端适配必须掌握的基本概念和适配方案
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5266725.html
Copyright © 2011-2022 走看看