与前一题类似,这道贪心也是要用数据结构来维护(悄悄话...现在题目怎么都离不开这数据结构捏唔)
题意:给定一个字符串S,S只由"(",")"和"?"组成,对于每一个问号变成左括号和右括号都需要不同的代价,问将所有?都改成括号且改好后的字符串S'为合法的括号序列的最小代价。
题解:这题会贪心的人应该是一眼题,可我最近好弱啊啊啊ww,马上就去学文化课了(其实挺高兴,最近做题有点精神不振),假设每次我们都把?改成右括号,这样每当到目前为止已经不是合法括号序列的时候,取前面问号中改成左括号所需代价最小的地方,将它改成左括号,并且左括号和右括号的差+2,然后找代价最小这个过程只要用优先队列来维护即可ww。
去睡了去睡了结束这颓然的一天吧呜呜呜
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#define ll long long
#define N 50500
using namespace std;
char st[N];
int l[N],r[N];
int main()
{
scanf("%s",st);
int n=strlen(st);
priority_queue<int> Q;
ll sum=0;
for(int i=0;i<n;i++)
if(st[i]=='?') scanf("%d%d",&l[i],&r[i]),sum+=r[i];
int rest=0;
bool flag=true;
for(int i=0;i<n;i++){
if(st[i]=='(') rest++;else rest--;
if(st[i]=='?') Q.push(r[i]-l[i]);
if(rest<0){
if(Q.empty()){flag=false;break;}
sum-=Q.top();Q.pop();rest+=2;
}
}
if(rest) flag=false;
if(flag) printf("%lld\n",sum);else puts("-1");
return 0;
}