【贪心算法】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 第一行一个 ...
随机推荐
- 微信小程序爬坑记
1.this.setData修改数组里的值1).data: { hide:[true,true] },this.setData({ 'hide[0]': false});2).var str = &q ...
- 解Bug之路-串包Bug
解Bug之路-串包Bug 笔者很热衷于解决Bug,同时比较擅长(网络/协议)部分,所以经常被唤去解决一些网络IO方面的Bug.现在就挑一个案例出来,写出分析思路,以飨读者,希望读者在以后的工作中能够少 ...
- lua数据结构之table的内部实现
一.table结构 1.Table结构体 首先了解一下table结构的组成结构,table是存放在GCObject里的.结构如下: typedef struct Table { CommonH ...
- [Binder深入学习一]Binder驱动——基础数据结构
具体代码路径: kernel/drivers/staging/android/binder.c kernel/drivers/staging/android/binder.h /* * binder_ ...
- 初等函数——指数函数(Exponential Function)
一般地,函数叫做指数函数,其中x是自变量,函数的定义域是R.
- 基于abp的小小设备控制系统设计
客户有一堆小设备,需要通过小程序来控制它们,主要是设备门的开关.电源开关.状态查询.压力控制等.下面主要纪录下设计思路.源码地址:https://gitee.com/bxjg1987/abp 最初的设 ...
- hystrix源码之AbstractCommand
AbstractCommand HystrixCommand和HystrixObservableCommand的父类.每个command对应一个HystrixCommandKey.HystrixThr ...
- Python实现自动生成小学四则运算题目
Github地址: https://github.com/guoyuyi/gyy.github.io/blob/%E4%BD%9C%E4%B8%9A1/zy1.py 题目描述: 通过python语言编 ...
- zabbix安装要求
zabbix server 和 zabbix Agent都在一个压缩包中,可以从官网上下载源码包,www.zabbix.com/download.php zabbix是C语言编写,压缩包的文件夹介绍: ...
- 一道Postgresql递归树题
转载请注明出处: https://www.cnblogs.com/funnyzpc/p/13698249.html 也是偶然的一次,群友出了一道题考考大家,当时正值疫情最最严重的三月(借口...),披 ...