Loading

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\n"),0;
			top+=2;
			Node u=que.top();que.pop();
			s[u.idx]='(';
			ans+=u.val;
		}
	}
	if(top||ans==-1)
		printf("-1\n");
	else printf("%lld\n%s",ans,s);
}
posted @ 2020-05-18 13:00  Gary_818  阅读(132)  评论(0编辑  收藏  举报