• CF3D Least Cost Bracket Sequence


    CF3D Least Cost Bracket Sequence

    题目大意

    给一个序列,序列里面会有左括号、问号、右括号。对于一个?而言,可以将其替换为一个(,也可以替换成一个),但是都有相应的代价。问:如何替换使得代价最小。前提是替换之后的序列中,括号是匹配的。如果不能替换为一个括号匹配的序列则输出-1。

    solution

    就暴力贪心,从左往右扫一遍,遇到没有匹配过括号就把(?)变成括号就可以了
    同时记录每个字符的原始状态的下标,方便转换之后能够找到改变了几次的最优解
    括号匹配的那个题,还是用一个栈来存储,能匹配到的就出栈,最终判断栈是否为空即可

    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define int long long 
    using namespace std;
    
    struct Node{
    	int val,idx;
    	Node(){}
    	Node(int a,int b){
    		val=a;idx=b;
    	}
    	bool operator<(const Node &A)const{
    		return val>A.val;
    	}
    };
    
    priority_queue<Node> que;
    char s[50002];
    int top;
    int ans;
    
    signed main(){
    	scanf("%s",s);
    	int l=strlen(s);
    	for(int i=0;i<l;i++){
    		if(s[i]=='(')top++;
    		else {
    			top--;
    			if(s[i]=='?'){
    				int a,b;
    				scanf("%d%d",&a,&b);
    				que.push(Node(a-b,i));
    				s[i]=')';
    				ans+=b;
    			}
    		}
    		if(top<0){
    			if(que.empty())
    				return printf("-1
    "),0;
    			top+=2;
    			Node u=que.top();que.pop();
    			s[u.idx]='(';
    			ans+=u.val;
    		}
    	}
    	if(top||ans==-1)
    		printf("-1
    ");
    	else printf("%lld
    %s",ans,s);
    }
    
  • 相关阅读:
    Python基础篇(七)
    RMI基础
    Python基础篇(五)
    装饰模式
    一些linux知识和http知识
    mysql统计一个库里面的表的总数
    关于phpmailer邮件发送
    Jenkins是什么?
    Android开发——JVM、Dalvik以及ART的区别【转帖】
    好记性不如烂笔头--linux学习笔记9练手写个shell脚本
  • 原文地址:https://www.cnblogs.com/rui-4825/p/12909928.html
Copyright © 2020-2023  润新知