• 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);
    }
    
  • 相关阅读:
    购物英语词汇
    生活学习英语词汇
    银行英语词汇
    烹饪英语词汇
    旅游英语词汇
    饮食英语词汇
    书英语词汇
    王元编辑口语资料中国传统之节日
    DataSet在WCF中怎么办?
    Python生成Wav格式文件
  • 原文地址:https://www.cnblogs.com/rui-4825/p/12909928.html
Copyright © 2020-2023  润新知