CodeForces 3 D.Least Cost Bracket Sequence【贪心+优先队列】
Description
给出一个括号序列,中间有一些问号,将第i个问号换成左括号代价是a[i],换成右括号代价是b[i],问如果用最少的代价将这个括号序列变成一个合法的括号序列
Input
第一行一个括号序列,假设其中有m个问号,则之后输入m行,每行两个整数a[i]和b[i]表示把第i个问号换成左括号或右括号的代价(括号序列长度不超过5e4,1<=a[i],b[i]<=1e6)
Output
如果不存在一种合理的替换方案使得该序列变成一个合法的括号序列则输出-1,否则输出最小代价和替换后的合法括号序列
Sample Input
(??) 1 2 2 8
Sample Output
4 ()()
分析
先把问号变成右括号,如果有问题就再把之前的问号变的右括号变成左括号,之前的代价是b[i]现在的代价是a[i],为使总代价最小我们从中选取a[i]-b[i]最小,也就是b[i]-a[i]最大的去重新变,所以用优先队列维护出现过的问号的b[i]-a[i]的值和其位置即可。
代码
#include<cstdio>
#include<cstring>
#include<stack>
#include<queue>
using namespace std;
#define ll long long
const int INF = 0x3f3f3f3f;
const int maxn = 5e5+;
char s[maxn];
int a[maxn],b[maxn];
priority_queue<pair<int,int> >que;
int main(){
while(~scanf("%s",s)){
int len=strlen(s);
ll ans=;
for(int i=;i<len;i++)
if(s[i]=='?'){
scanf("%d%d",&a[i],&b[i]);
ans+=b[i];
}
int cnt=,g=;
while(!que.empty())que.pop();
for(int i=;i<len;i++){
if(g)break;
if(s[i]=='(')cnt++;
else{
cnt--;
if(s[i]=='?')que.push(pair<int,int>(b[i]-a[i],i)),s[i]=')';
if(cnt<){
if(que.empty())g=;
else{
pair<int,int> temp=que.top();
que.pop();
ans-=temp.first;
cnt+=;
s[temp.second]='(';
}
}
}
}
if(cnt!=)g=;
if(g)printf("-1\n");
else printf("%lld\n%s\n",ans,s);
}
return ;
}
CodeForces 3 D.Least Cost Bracket Sequence【贪心+优先队列】的更多相关文章
- CF3D Least Cost Bracket Sequence 贪心
Least Cost Bracket Sequence CodeForces - 3D 题目描述 This is yet another problem on regular bracket sequ ...
- codeforces 3D . Least Cost Bracket Sequence 贪心
题目链接 给一个字符串, 由( ) 以及? 组成, 将?换成( 或者 ) 组成合法的括号序列, 每一个?换成( 或者 ) 的代价都不相同, 问你最小代价是多少, 如果不能满足输出-1. 弄一个变量nu ...
- 【Codeforces 3D】Least Cost Bracket Sequence
Codeforces 3 D 题意:有一个括号序列,其中一些位置是问号,把第\(i\)个问号改成(需要\(a_i\)的代价,把它改成)需要\(b_i\)的代价. 问使得这个括号序列成立所需要的最小代价 ...
- Codeforces Beta Round #3 D. Least Cost Bracket Sequence 优先队列
D. Least Cost Bracket Sequence 题目连接: http://www.codeforces.com/contest/3/problem/D Description This ...
- Least Cost Bracket Sequence(贪心)
Least Cost Bracket Sequence(贪心) Describe This is yet another problem on regular bracket sequences. A ...
- (CodeForces - 5C)Longest Regular Bracket Sequence(dp+栈)(最长连续括号模板)
(CodeForces - 5C)Longest Regular Bracket Sequence time limit per test:2 seconds memory limit per tes ...
- CF3D Least Cost Bracket Sequence 题解
题目 This is yet another problem on regular bracket sequences. A bracket sequence is called regular, i ...
- cf3D Least Cost Bracket Sequence
This is yet another problem on regular bracket sequences. A bracket sequence is called regular, if b ...
- C. Playlist Educational Codeforces Round 62 (Rated for Div. 2) 贪心+优先队列
C. Playlist time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...
随机推荐
- JAVASE(十七) 多线程:程序、进程、线程与线程的生命周期、死锁、单例、同步锁
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.程序.进程.线程的理解 1.1 概念 程序(program)是为完成特定任务.用某种语言编写的一组指 ...
- Java并发编程 (十) 多线程并发拓展
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.死锁 1.死锁的定义 所谓的死锁是指两个或两个以上的线程在等待执行的过程中,因为竞争资源而造成的一种 ...
- Java实现 LeetCode 811 子域名访问计数 (暴力)
811. 子域名访问计数 一个网站域名,如"discuss.leetcode.com",包含了多个子域名.作为顶级域名,常用的有"com",下一级则有" ...
- Java实现 LeetCode 657 机器人能否返回原点(暴力大法)
657. 机器人能否返回原点 在二维平面上,有一个机器人从原点 (0, 0) 开始.给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束. 移动顺序由字符串表示.字符 move[i ...
- Java实现 LeetCode 61 旋转链表
61. 旋转链表 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = ...
- java实现数字的值返回
以下的静态方法实现了:把串 s 中第一个出现的数字的值返回. 如果找不到数字,返回-1 例如: s = "abc24us43" 则返回 2 s = "82445adb5& ...
- java代码(5) ---guava之Multiset
guava之Multiset 一.概述 Guava提供了一个新集合类型Multiset,它可以多次添加相等的元素,且和元素顺序无关,Multiset继承于JDK的Collection接口,而不是Se ...
- Linux文件处理命令touch、cat、more、head详解
命令touch详解 命令touch,所在路径及执行权限为: 可以看到,命令的路径为:/usr/bin/touch ,所以它的执行权限为所有用户 命令基本功能是创建空文件 (可以同时创建多个空文件,文件 ...
- 【JVM故事】一个Java字节码文件的诞生记
万字长文,完全虚构. (一) 组里来了个实习生,李大胖面完之后,觉得水平一般,但还是留了下来,为什么呢?各自猜去吧. 李大胖也在心里开导自己,学生嘛,不能要求太高,只要肯上进,慢慢来.就称呼为小白吧. ...
- Jenkins job docker 没有权限
问题描述 基于docker使用jenkins 构建cicd,在执行docker build 的时候出现了权限的问题.具体报错如下 + REPOSITORY=10.0.0.100/library/wen ...