51nod 1476 括号序列的最小代价

14 篇文章 0 订阅
8 篇文章 0 订阅

题目题目啦~


与前一题类似,这道贪心也是要用数据结构来维护(悄悄话...现在题目怎么都离不开这数据结构捏唔)

题意:给定一个字符串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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值