zoukankan      html  css  js  c++  java
  • CodeForces 3 D.Least Cost Bracket Sequence【贪心+优先队列】

    Description

    给出一个括号序列,中间有一些问号,将第i个问号换成左括号代价是a[i],换成右括号代价是b[i],问如果用最少的代价将这个括号序列变成一个合法的括号序列

    Input

    第一行一个括号序列,假设其中有m个问号,则之后输入m行,每行两个整数a[i]和b[i]表示把第i个问号换成左括号或右括号的代价(括号序列长度不超过5e4,1<=a[i],b[i]<=1e6)

    Output

    如果不存在一种合理的替换方案使得该序列变成一个合法的括号序列则输出-1,否则输出最小代价和替换后的合法括号序列

    Sample Input

    (??) 1 2 2 8

    Sample Output

    4 ()()

    分析

    先把问号变成右括号,如果有问题就再把之前的问号变的右括号变成左括号,之前的代价是b[i]现在的代价是a[i],为使总代价最小我们从中选取a[i]-b[i]最小,也就是b[i]-a[i]最大的去重新变,所以用优先队列维护出现过的问号的b[i]-a[i]的值和其位置即可。

    代码

    #include<cstdio>
    #include<cstring>
    #include<stack>
    #include<queue>
    using namespace std;
    #define ll long long
    const int INF = 0x3f3f3f3f;
    const int maxn = 5e5+10;
    char s[maxn];
    int a[maxn],b[maxn];
    priority_queue<pair<int,int> >que;
    int main(){
        while(~scanf("%s",s)){
            int len=strlen(s);
            ll ans=0;
            for(int i=0;i<len;i++)
                if(s[i]=='?'){
                    scanf("%d%d",&a[i],&b[i]);
                    ans+=b[i];
                }
            int cnt=0,g=0;
            while(!que.empty())que.pop();
            for(int i=0;i<len;i++){
                if(g)break;
                if(s[i]=='(')cnt++;
                else{
                    cnt--;
                    if(s[i]=='?')que.push(pair<int,int>(b[i]-a[i],i)),s[i]=')';
                    if(cnt<0){
                        if(que.empty())g=1;
                        else{
                            pair<int,int> temp=que.top();
                            que.pop();
                            ans-=temp.first;
                            cnt+=2;
                            s[temp.second]='(';
                        }
                    }
                }
            }
            if(cnt!=0)g=1;
            if(g)printf("-1
    ");
            else printf("%lld
    %s
    ",ans,s); 
        }
        return 0;
    }
  • 相关阅读:
    【BZOJ4568】幸运数字(SCOI2016)-树上倍增+异或线性基合并
    【BZOJ2115】XOR(WC2011)-异或线性基+DFS树+贪心
    【HDU3949】XOR-异或线性基
    【BZOJ3105】新Nim游戏(CQOI2013)-博弈论+异或线性基+贪心
    购物单 && 动态规划 && 背包问题
    求int型正整数在内存中存储时1的个数 && int型的数到底最大是多少?
    Eqaulize Prices
    Nearest Interesting Number
    英文句子的逆序
    字符串反转
  • 原文地址:https://www.cnblogs.com/Vocanda/p/12911081.html
Copyright © 2011-2022 走看看