括号序列的最小代价

题意

查看原题

这里有一个关于合法的括号序列的问题。

如果插入“+”和“1”到一个括号序列,我们能得到一个正确的数学表达式,我们就认为这个括号序列是合法的。例如,序列"(())()", "()"和"(()(()))"是合法的,但是")(", "(()"和"(()))("是不合法的。我们这有一种仅由“(”,“)”和“?”组成的括号序列,你必须将“?”替换成括号,从而得到一个合法的括号序列。

对于每个“?”,将它替换成“(”和“)”的代价已经给出,在所有可能的变化中,你需要选择最小的代价。

Input

第一行是一个非空的偶数长度的字符串,它仅由“(”,“)”和“?”组成。它的长度不大于 50000。接着是m行,m是字符串中“?”的个数。每一行包含两个整数 ai和bi ( 1<=ai,bi<=1000000), ai是将第i个“?”替换成左括号的代价, bi是将第i个“?”替换成右括号的代价。

Output

在一行中输出合法的括号序列的最小代价。
如果没有答案,输出-1。

Input示例

(??)
1 2
2 8

Output示例

4

思路

刚开始把?全部用)替换。然后记录一下标记前缀和s,(标记为+1,)标记为-1。如果遇到某个时候s<0,那么就把之前的?里面里从右括号变成左括号需要的费用最少的改成(。并s+=2。这一步可以用优先队列来维护。

 1 #include <map>
 2 #include <set>
 3 #include <cmath>
 4 #include <ctime>
 5 #include <stack>
 6 #include <queue>
 7 #include <cstdio>
 8 #include <cctype>
 9 #include <bitset>
10 #include <string>
11 #include <vector>
12 #include <cstring>
13 #include <iostream>
14 #include <algorithm>
15 #include <functional>
16 #define fuck(x) cout<<"["<<x<<"]";
17 #define FIN freopen("input.txt","r",stdin);
18 #define FOUT freopen("output.txt","w+",stdout);
19 //#pragma comment(linker, "/STACK:102400000,102400000")
20 using namespace std;
21 typedef long long LL;
22 typedef pair<int, int> PII;
23 typedef long long LL;
24
25 const int MX = 5e4 + 5;
26
27 char S[MX];
28 int L[MX], R[MX];
29
30 int main() {
31     //FIN;
32     scanf("%s", S);
33     int n = strlen(S);
34
35     priority_queue<int> Q;
36     LL sum = 0; bool ok = true;
37     for(int i = 0; i < n; i++) {
38         if(S[i] == ‘?‘) {
39             scanf("%d%d", &L[i], &R[i]);
40             sum += R[i];
41         }
42     }
43
44     int now = 0;
45     for(int i = 0; i < n; i++) {
46         if(S[i] == ‘(‘) now++;
47         else if(S[i] == ‘)‘ || S[i] == ‘?‘) now--;
48         if(S[i] == ‘?‘) Q.push(R[i] - L[i]);
49         if(now < 0) {
50             if(Q.empty()) {
51                 ok = false; break;
52             }
53             sum -= Q.top(); Q.pop(); now += 2;
54         }
55     }
56     if(now != 0) ok = false;
57     printf("%I64d\n", ok ? sum : -1);
58     return 0;
59 }

【REFERENCE】

优先队列+括号配对 51Nod1476 括号序列的最小代价

时间: 2024-07-28 14:38:25

括号序列的最小代价的相关文章

51nod 1476 括号序列的最小代价 (括号题套路+反悔贪心)

题意:给一串只有'(' , ')' , '?' 的括号序列,每个?可以变成)或者(,代价分别为bi和ai,求变成合法序列的最小代价 思路:学习自最近的网络赛&&51nod贪心专题视频的思想,“反悔”,一般在获取收益有限制的情况下使用 先按某种“优”的策略贪心,如果不满足限制条件了,取一个修改后代价尽可能小的状态修改成满足条件的状态,得到新的满足限制下的最优解 这种贪心常常可以借助优先队列实现 然后是括号题的套路:把(当做1,把)当做-1,做前缀和 这题中,先当做所有的?都换成右括号,这是显

2017-5-14 湘潭市赛 Parentheses 转化思想+贪心 使括号序列合法的最小花费。满足前面左括号的数量&gt;=有括号的数量。

Parentheses Accepted : 8 Submit : 19 Time Limit : 3000 MS Memory Limit : 65536 KB Parentheses Bobo has a very long sequence divided into n consecutive groups. The i-th group consists of li copies of character ci where ci is either "(" or ")

[swustoj 404] 最小代价树

最小代价树(0404) 问题描述 以下方法称为最小代价的字母树:给定一正整数序列,例如:4,1,2,3,在不改变数的位置的条件下把它们相加,并且用括号来标记每一次加法所得到的和. 例如:((4+1)+ (2+3))=((5)+(5))=10.除去原数不4,1,2,3之外,其余都为中间结果,如5,5,10,将中间结果相加,得到:5+5+10= 20,那么数20称为此数列的一个代价,若得到另一种算法:(4+((1+2)+3))=(4+((3)+3))=(4+(6))=10,数列的另一个代价为:3+6

[Swust OJ 404]--最小代价树(动态规划)

题目链接:http://acm.swust.edu.cn/problem/code/745255/ Time limit(ms): 1000 Memory limit(kb): 65535 Description 以下方法称为最小代价的字母树:给定一正整数序列,例如:4,1,2,3,在不改变数的位置的条件下把它们相加,并且用括号来标记每一次加法所得到的和. 例如:((4+1)+ (2+3))=((5)+(5))=10.除去原数不4,1,2,3之外,其余都为中间结果,如5,5,10,将中间结果相加

BZOJ2209: [Jsoi2011]括号序列

传送门 splay练习. 考虑把括号序列转化成类似于区间最大/最小值的情况. 显然我们可以知道括号序列消完的情况肯定是$a$个)和$b$个(,那么把这些括号全部合法化的代价显然就是$\frac{a+1}{2}+\frac{b+1}{2}$. 接着我们可以把'('变为1,把')'变为-1,然后每次取左区间的连续最小值,右区间的连续最大值,就是$a$与$b$的大小. 因为存在区间翻转,所以需要把左/右区间的连续最大/小值都搞出来. splay即可. //BZOJ2209 //by Cydiater

1478 括号序列的最长合法子段

1478 括号序列的最长合法子段 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 这里有另一个关于处理合法的括号序列的问题. 如果插入“+”和“1”到一个括号序列,我们能得到一个正确的数学表达式,我们就认为这个括号序列是合法的.例如,序列"(())()", "()"和"(()(()))"是合法的,但是")(", "(()"和"(

关于最小代价子母树

第一次尝试写动态规划(Dynamic Planning)= 问题如下: ------------------------------------------------------------------------------------------------------------------------- 最小代价子母树 设有一排数,共n个,例如:22 14 7 13 26 15 11.任意2个相邻的数可以进行归并,归并的代价为该两个数的和,经过不断的归并,最后归为一堆,而全部归并代价的

BZOJ 2209: [Jsoi2011]括号序列 [splay 括号]

2209: [Jsoi2011]括号序列 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1111  Solved: 541[Submit][Status][Discuss] Description Input 输入数据的第一行包含两个整数N和Q,分别表示括号序列的长度,以及操作的个数. 第二行包含一个长度为N的括号序列. 接下来Q行,每行三个整数t.x和y,分别表示操作的类型.操作的开始位置和操作的结 束位置,输入数据保证x不小于y.其中t=0表

Codevs3657括号序列题解

题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则(S)和[S]都是合法的 (3)假如A和B都是合法的,那么AB和BA也是合法的 例如以下是一些合法的括号序列: (),[],(()),([]),()[],()[()] 以下是一些不合法括号序列的: (,[,],)(,([]),([() 现在给定一些由"(",")","[","]"构成的序列 ,请添加尽