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);
}