哎,昨天一直在赶课设。。没有写

最近听了一些人的建议,停止高级算法的学习,开始刷cf。

目前打算就是白天懒得背电脑的话,系统刷一遍蓝书紫书白书之类的(一直没系统刷过),回宿舍再上机吧。

https://www.luogu.org/problem/CF3D

题意:就是给你一个由 '(' , ')' , '?'组成的字符串,可以把'?'变成'('或')',但需要一定的代价,问使得括号匹配前提下的最小代价。

做法:贪心真的是个神奇的东东。。可以这么做,先从左扫到右,遇到'('就mark++,否则mark--(先把问号都当成右括号),如果是问号的话就顺便把它扔到优先队列,优先队列按-b+a排序,然后如果当前mark<0,就弹出个top(),给他变成左括号,优先队列为空说明无解。

#include<cstdio>
#include<queue>
using namespace std;
struct Data { //优先队列的元素
int delta; //这是-b+a
char *p; //这是?的位置
bool operator <(const Data &b)const { //重定义比较运算符进行降序排列
return delta>b.delta;
}
}t;
priority_queue<Data> q; //优先队列
char s[50002];
int main() {
int mark=0; //计数器
long long ans=0;
scanf("%s",s);
for(int i=0,a,b;s[i]&&ans!=-1;++i) {
if(s[i]=='(') //计数器加1
++mark;
else {
--mark; //计数器减1,'?'也一样,因为开始时设想所有的'?'都是')'
if(s[i]=='?') {
scanf("%d%d",&a,&b);
t.delta=a-b;
t.p=s+i; //给指针赋值
q.push(t); //入队
s[i]=')';
ans+=b;
}
}
if(mark<0) { //此时要到前面去找'?'
if(q.empty())
ans=-1; //如果队列为空,那么字符串不合法
if(ans!=-1) {
mark+=2;
t=q.top(); //取队尾元素并替换
q.pop();
*t.p='(';
ans+=t.delta;
}
}
}
if(mark) //判断计数器是否为0,否则字符串不合法
ans=-1;
printf("%I64d",ans); //用%I64d
if(ans!=-1)
printf("\n%s",s);
return 0;
}

CF3D Least Cost Bracket Sequence(2500的实力贪心...的更多相关文章

  1. CF3D Least Cost Bracket Sequence 贪心

    Least Cost Bracket Sequence CodeForces - 3D 题目描述 This is yet another problem on regular bracket sequ ...

  2. cf3D Least Cost Bracket Sequence

    This is yet another problem on regular bracket sequences. A bracket sequence is called regular, if b ...

  3. CF3D Least Cost Bracket Sequence 题解

    题目 This is yet another problem on regular bracket sequences. A bracket sequence is called regular, i ...

  4. 【贪心算法】CF3D Least Cost Bracket Sequence

    题目大意 洛谷链接 给一个序列,序列里面会有左括号.问号.右括号.对于一个?而言,可以将其替换为一个(,也可以替换成一个),但是都有相应的代价.问:如何替换使得代价最小.前提是替换之后的序列中,括号是 ...

  5. Codeforces Beta Round #3 D. Least Cost Bracket Sequence 优先队列

    D. Least Cost Bracket Sequence 题目连接: http://www.codeforces.com/contest/3/problem/D Description This ...

  6. Least Cost Bracket Sequence(贪心)

    Least Cost Bracket Sequence(贪心) Describe This is yet another problem on regular bracket sequences. A ...

  7. 【贪心】【CF3D】 Least Cost Bracket Sequence

    传送门 Description 给一个序列,序列里面会有左括号.问号.右括号.对于一个\(?\)而言,可以将其替换为一个\((\),也可以替换成一个\()\),但是都有相应的代价.问:如何替换使得代价 ...

  8. 3 D. Least Cost Bracket Sequence

    题目大意: 这是一个规则的字符括号序列.一个括号序列是规则的,那么在序列里面插入‘+’ 和 ‘1’ 会得到一个正确的数学表达式. 合法:(())(), (),(()(())) 不合法:)(,((),( ...

  9. codeforces 3D . Least Cost Bracket Sequence 贪心

    题目链接 给一个字符串, 由( ) 以及? 组成, 将?换成( 或者 ) 组成合法的括号序列, 每一个?换成( 或者 ) 的代价都不相同, 问你最小代价是多少, 如果不能满足输出-1. 弄一个变量nu ...

随机推荐

  1. Codeforces Round #603 (Div. 2)F. Economic Difficulties

    F. Economic Difficulties 题目链接: https://codeforces.com/contest/1263/problem/F 题目大意: 两棵树,都有n个叶子节点,一棵树正 ...

  2. Count on a tree(树上路径第K小)

    题目链接:https://www.spoj.com/problems/COT/en/ 题意:求树上A,B两点路径上第K小的数 思路:主席树实际上是维护的一个前缀和,而前缀和不一定要出现在一个线性表上. ...

  3. android中各种组件的生命周期问题

    1,activiy生命周期 http://www.ibm.com/developerworks/cn/opensource/os-cn-android-actvt/ 结合ativity的状态转换来看才 ...

  4. 大数据笔记(二)——Apache Hadoop的体系结构

    一.分布式存储 NameNode(名称节点) 1.维护HDFS文件系统,是HDFS的主节点. 2.接收客户端的请求:上传.下载文件.创建目录等. 3.记录客户端操作的日志(edits文件),保存了HD ...

  5. 年薪100万的人都是怎么玩Excel的?

    年薪100万的人都是怎么玩Excel的? 2017-12-21 13:42美国 作者:珍妮Jenny 来源:一周进步(ID:weekweekup) 本文已获原作者转载授权,如需转载请联系原公号 本文重 ...

  6. The MEAN stack is a modern replacement for the LAMP (Linux, Apache, MySQL, PHP/Python) stack

    w https://www.mongodb.com/blog/post/building-your-first-application-mongodb-creating-rest-api-using- ...

  7. leetcode 52 N皇后问题 II

    51的简化版,省去根据排列话棋盘的工作,直接计数,代码: class Solution { public: int totalNQueens(int n) { ; vector<); dfs(n ...

  8. JS - 创建只读属性

    一:为私有变量创建get()方法 这种方式可以创建 "伪 "只读属性.这并不是一种好方法,因为使用_函数_获得只读的_属性_不太符合一般的逻辑. /** * Represent a ...

  9. 错误 warning: LF will be replaced by CRLF in README.md.

    问题类型 windows中的换行符为 CRLF, 而在Linux下的换行符为LF,所以在执行add . 时出现提示:warning: LF will be replaced by CRLF in RE ...

  10. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_09 Debug调试_1_Debug追踪

    行号的右边.点击就加上红色的原点 执行后程序停在断点的这一行代码 F8 Shift+F8从方法中出来. F9跳到下一个断点. 终止程序 Ctrl+F2: 断点停留在第一行之后,F8进入下一行代码. 再 ...