ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF3D Least Cost Bracket Sequence 题解

2022-09-11 11:35:03  阅读:176  来源: 互联网

标签:Sequence 题解 替换成 括号 Least 序列 右换 CF3D 代价


CF3D

题意

一个括号序列,其中有几位为 ?,将第 \(i\) 个 ? 修改为 ( 的代价是 \(a_i\),修改为 ) 的代价是 \(b_i\),问将所有 ? 修改后使得序列匹配的最小代价。

分析

贪心。发现一个匹配的括号序列的每一个前缀的左括号数一定不小于右括号数,因此先把问号都替换成右括号,对于每一位判断一下,如果到这一位时右括号数大于左括号数,就把前面右换左代价最小的一位替换成左。这样一定是正确的,因为前面如果左括号多了后面还能补救,但是右括号多了前面就不能完全匹配了。

于是可以从前往后扫,遇到一个问号就换成右括号,并把这个位置的下标和右换左的代价一起扔到一个小根堆里,如果右括号多了就取出堆顶换成左括号。

核心代码

priority_queue<Pair,vector<Pair>,greater<Pair> >q;
signed main(){
    scanf("%s",s+1);n=strlen(s+1);int i,j,cnt=0;
    for(i=1;i<=n;i++) if(s[i]=='?') m++,mp[i]=++mp[0];for(i=1;i<=m;i++) qread(a[i],b[i]);
    for(i=1;i<=n;i++){
        if(s[i]=='(') cnt++,t[i]=s[i];if(s[i]==')') cnt--,t[i]=s[i];
        if(s[i]=='?'){
            t[i]=')';q.push(Pair(a[mp[i]]-b[mp[i]],i));cnt--;ans+=b[mp[i]];
        }if(cnt<0){
            if(q.empty()) return printf("-1\n"),0;
            auto u=q.top();q.pop();t[u.second]='(';cnt+=2;
            // cout<<u.first<<" "<<u.second<<endl;
            ans+=u.first;
        }
    }if(cnt) return printf("-1\n"),0;
    printf("%lld\n%s\n",ans,t+1);
    return 0;
}

标签:Sequence,题解,替换成,括号,Least,序列,右换,CF3D,代价
来源: https://www.cnblogs.com/lxy-2022/p/CF3D-Solution.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有