【贪心算法】CF3D Least Cost Bracket Sequence
题目大意
洛谷链接
给一个序列,序列里面会有左括号、问号、右括号。对于一个?而言,可以将其替换为一个(,也可以替换成一个),但是都有相应的代价。问:如何替换使得代价最小。前提是替换之后的序列中,括号是匹配的。如果不能替换为一个括号匹配的序列则输出\(-1\)。
输入格式
第一行是序列,序列长度不超过\(5×10^4\),下面\(m\)(\(m\)是?的数量)行有每行2个数据,第一个是(的代价,第二个是)的代价。
输出格式
第一行打印代价,第二行打印替换后的序列。不行输出\(-1\)。
数据范围
\(1≤a_i,b_i≤10^6\)
样例输入
(??)
1 2
2 8
样例输出
4
()()
思路
使用贪心,首先把所有的?改成)。重新扫描,如果此时右括号的个数比左括号的个数多,那么说明需要修改。此时修改的代价就为\(a[i]-b[i]\),用小根堆储存,从小的?处开始修改。
无解的情况:
- 最左边是右括号,最右边是左括号。
- 问号的个数比左右括号相差值小。
- 最后匹配完左右括号数不相等。
代码
#include<bits/stdc++.h>
#define F first
#define S second
using namespace std;
typedef long long ll;
const int maxn=5e4+10;
char s1[maxn],s2[maxn];
ll totl,totr,ans;
ll a[maxn],b[maxn];
priority_queue <pair<ll,ll>,vector<pair<ll,ll> >,greater<pair<ll,ll> > > q;
int main() {
scanf("%s",s1);
strcpy(s2,s1);
ll len1=strlen(s1),len2=0,sum=0;
if(s1[0]==')'||s1[len1-1]=='('){//左边是右括号或者右边是左括号,无解
puts("-1");return 0;
}
for(int i=0;i<len1;i++) {
if(s1[i]=='(')totl++;
else if(s1[i]==')')++totr;
else{//否则是问号,先改为右括号
s2[i]=')';
scanf("%d%d",&a[i],&b[i]);
sum++;//问号数+1
}
}
if(fabs(totl-totr)>sum){//问号数比左右括号相差数小
puts("-1");return 0;
}
totl=totr=0;
if(s1[0]=='?')s2[0]='(';//最左边的肯定改成左括号
totl++;//无论上面那个是否修改s2[0]都肯定是左括号(否则就直接return 0了),先加个1再说
for(int i=1;i<strlen(s2);i++) {
if(s1[i]=='?')q.push(make_pair(a[i]-b[i],i));
if(s2[i]=='(')totl++;
else if(s2[i]==')')totr++;
if(totr>totl){//如果右括号比左括号多,就从小到大改括号方向
s2[q.top().S]='(';
totr--;
totl++;
q.pop();
}
}
if(totr-totl){
puts("-1");return 0;
}
for(int i=0;i<strlen(s2);i++) {
if(s1[i]=='?'){
if(s2[i]=='(')ans+=a[i];
else ans+=b[i];
}
}
cout<<ans<<endl;
cout<<s2;
return 0;
}
【贪心算法】CF3D Least Cost Bracket Sequence的更多相关文章
- CF3D Least Cost Bracket Sequence 贪心
Least Cost Bracket Sequence CodeForces - 3D 题目描述 This is yet another problem on regular bracket sequ ...
- 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 ...
- CF3D Least Cost Bracket Sequence(2500的实力贪心...
哎,昨天一直在赶课设..没有写 最近听了一些人的建议,停止高级算法的学习,开始刷cf. 目前打算就是白天懒得背电脑的话,系统刷一遍蓝书紫书白书之类的(一直没系统刷过),回宿舍再上机吧. https:/ ...
- Least Cost Bracket Sequence(贪心)
Least Cost Bracket Sequence(贪心) Describe This is yet another problem on regular bracket sequences. A ...
- Codeforces Beta Round #3 D. Least Cost Bracket Sequence 优先队列
D. Least Cost Bracket Sequence 题目连接: http://www.codeforces.com/contest/3/problem/D Description This ...
- 【贪心】【CF3D】 Least Cost Bracket Sequence
传送门 Description 给一个序列,序列里面会有左括号.问号.右括号.对于一个\(?\)而言,可以将其替换为一个\((\),也可以替换成一个\()\),但是都有相应的代价.问:如何替换使得代价 ...
- codeforces 3D . Least Cost Bracket Sequence 贪心
题目链接 给一个字符串, 由( ) 以及? 组成, 将?换成( 或者 ) 组成合法的括号序列, 每一个?换成( 或者 ) 的代价都不相同, 问你最小代价是多少, 如果不能满足输出-1. 弄一个变量nu ...
- CodeForces 3 D.Least Cost Bracket Sequence【贪心+优先队列】
Description 给出一个括号序列,中间有一些问号,将第i个问号换成左括号代价是a[i],换成右括号代价是b[i],问如果用最少的代价将这个括号序列变成一个合法的括号序列 Input 第一行一个 ...
随机推荐
- 【微信小程序】常用组件及自定义组件
(一) 常用标签 组件你可以理解为传统页面开发时候的各种标签,例如 div span 等等,我这里只说一些常用的,这样就能能搭建出一个基本的页面了,但是如果想要更加美观以及拥有更好的体验,就需要 XS ...
- ctfhub 报错注入
payload 1 Union select count(*),concat((查询语句),0x26,floor(rand(0)*2))x from information_schema.colu ...
- C#类库推荐 拼多多.Net SDK,开源免费!
背景介绍 近两年拼多多的发展非常迅速,即便口碑一般,也没有网页端,奈何我们已经全面小康,6亿月收入1000以下,9亿月收入2000以下,所以因为价格原因使用拼多多的用户也越来越多了.同样的,拼多多也开 ...
- k8s运行容器之Job(四)
Job 容器按照持续运行的时间可分为两类:服务类容器和工作类容器. 服务类容器通常持续提供服务,需要一直运行,比如 http server,daemon 等.工作类容器则是一次性任务,比如批处理程序, ...
- php判断请求方式
1 /** 2 * 判断是否为get请求 3 * 4 * @return bool 5 */ 6 function is_get():bool 7 { 8 return $_SERVER['REQUE ...
- python爬取酷狗音乐
url:https://www.kugou.com/yy/html/rank.html 我们随便访问一个歌曲可以看到url有个hash https://www.kugou.com/song/#hash ...
- 快速上手spring
一.初始程序 1.在父类pom导入所需要的jar包 2.编写一个实体类 3.创建一个beans.xml,创建一个bean即创建一个user对象,可在bean内配置property即设置属性值 4.用测 ...
- 谷歌发布Flutter Alpha:支持Windows
老孟导读:Windows来了,Mac.Linux.Web还远吗? 本文翻译自https://medium.com/flutter/announcing-flutter-windows-alpha-33 ...
- 【Processing-日常3】等待动画1
之前在CSDN上发表过: https://blog.csdn.net/fddxsyf123/article/details/79755976
- Linux初步了解
文件系统类型:swap分区:用于内存扩充,用磁盘兑换,磁盘是内存的两倍,便于替换 / 分区:容纳根文件系统 文件名:由字母,数字,下划线,圆点组成 文件类型:显示在每一行的左边第一个字符 普通文件 ...