正题

题目链接:https://www.luogu.org/problemnew/show/P4989


题目大意

一个二进制数两两配对,要求

  1. 配对的数不能交叉(用同一个区间但不包含)
  2. 0在前1在后

要求配对最多的情况下所有配对的距离之和最远。


解题思路

将0视为左括号,1视为右括号,题目变为括号匹配问题。

我们考虑贪心,先是交叉的问题,我们发现如果两个交叉了,我们让他们反过来配对(配对方的那个)的话答案并不会改变。所有我们不要考虑交叉问题。

那我们开始做,首先不考虑配对最多,我们可以开一个小根堆,存储目前所有已经匹配的右括号还有未左括号的位置。然后我们每次到一个右括号时,取出最小的那个与其匹配并计算多出来的代价。然后从新丢入堆中。

这是距离之和最远,但是配对最多怎么办,那么我们定义权值,小根堆维护权值。对于已经匹配的右括号我们权值就是它的位置;对于没有匹配的左括号,我们让它的权值加上一个−inf-inf−inf就可以了。

这样就可以保证优先匹配没有匹配的且权值最大。

时间复杂度O(nlogn)O(n\ log\ n)O(n log n)


codecodecode

#include<cstdio>
#include<queue>
#include<iostream>
using namespace std;
struct node{int wz,w;
};
bool operator <(const node &a,const node &b)
{return a.w<b.w;}
priority_queue<node> q;
int n,ans,a[1000];
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){char c;cin>>c;a[i]=c-'0';}for(int i=1;i<=n;i++){if(!a[i]) q.push((node){i,233333333-i});else{if(q.empty()) continue;ans+=i-q.top().wz;q.pop();q.push((node){i,-i});}}printf("%d",ans);
}

P4989-二进制之谜【堆,贪心】相关推荐

  1. c++算术溢出_二进制安全之堆溢出(系列)——CTF环境配置

    [重要通知]知了堂禁卫实验室全新上线!! 这里有安全体系的学习资源. 最前沿的原创文章.最新的漏洞挖掘原创!! 本期是"二进制安全之堆溢出"系列第一期,主要介绍CTF环境配置.安装 ...

  2. malloc 结构体_二进制安全之堆溢出(系列)——堆基础 amp; 结构(二)

    哈喽啊 这里是二进制安全之堆溢出(系列)第二期"堆基础 & 结构"第二节!! 话不多说,直接上干货! 微观结构 函数执行流程 void *malloc (size_t by ...

  3. |Tyvj|NOIP2004|堆|贪心|P1066 合并果子

    http://tyvj.cn/p/1066 贪心地先把所有果子放进小根堆,然后取出两个最小值相加后再放进去,在此期间ans+=两个最小值的和,直到只剩1个元素停止 #include<cstdio ...

  4. P7990-[USACO21DEC]Closest Cow Wins S【堆,贪心】

    正题 题目链接:https://www.luogu.com.cn/problem/P7990 题目大意 数轴上有kkk个点是草地,每个草地有不同收益,mmm个点是地方的点,现在你要放置nnn个我方的点 ...

  5. jzoj1082-合并果子【堆,贪心】

    题目 有n堆大小不同的果子堆,每次合并两堆消耗它们两堆的重量之和,求把它们全部合并的最小消耗 输入 输入包括两行,第一行是一个整数n(1<=n<=10000),表示果子的种类数.第二行包含 ...

  6. 【洛谷】【堆+贪心】P1484 种树

    [题目描述:] cyrcyr今天在种树,他在一条直线上挖了n个坑.这n个坑都可以种树,但为了保证每一棵树都有充足的养料,cyrcyr不会在相邻的两个坑中种树.而且由于cyrcyr的树种不够,他至多会种 ...

  7. [堆+贪心] CF596C. Wilbur and Points

    CF596C. Wilbur and Points 题意: 太难懂了.有一个平面点集,对集合中任意一点(x,y),满足以原点和(x,y)构成的矩形边上和内部的所有点也都在集合里. 现在要给点标号,为了 ...

  8. BZOJ 1029: [JSOI2007]建筑抢修 堆+贪心

    1029: [JSOI2007]建筑抢修 Description 小刚在玩JSOI提供的一个称之为"建筑抢修"的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的 入侵者.但 ...

  9. 11.03 P73 模拟+堆+贪心

    第二题 问题描述 题解 代码 死亡 问题描述 题解 代码 凝视 问题描述 错的不严格题解 bug 代码 tips 每个测试点时限 1 秒 1 秒 1 秒 内存限制 512MB 512MB 512MB ...

最新文章

  1. 一周一论文(翻译 总结)— [SOCC 13] jVerbs Ultra-Low Latency for Data Center Applications 在JVM虚拟机上构建RDMA的verbs操作
  2. android 手机关机代码非root,怎么用代码判断android手机是否开启了ROOT 权限知道...
  3. 计算机能模拟图灵机吗,关于计算机科学:图灵机与冯诺依曼机器
  4. c语言中全局变量内存,C语言——全局变量和局部变量在内存中的区别——及编译后的内存分区【栈-堆-全局存储区-文字常量区-程序代码区】...
  5. 抓包工具-charles安装过程
  6. java json乱码_Java Http请求传json数据乱码问题的解决
  7. C语言丨线性查找(顺序查找)
  8. 4.6 GoogLeNet CNN、tensorflow实现——python实战
  9. iOS xcode The certificate used to sign Administrator has either expired or has been revoked. An u
  10. Java对象实例化以及实例化方式
  11. 华为笔试题大全(史上最齐全)
  12. 计算机考研408难吗?学到什么程度才能考130?
  13. uc android flash插件,UC7.3 Android手机上网新体验 支持Flash游戏
  14. Manjaro Linux安装QQ和微信
  15. hexo搭建个人博客之seo优化
  16. Laya 将传统的bitmap字体 转换成 Laya可以识别的字体
  17. TCP连接大量CLOSE_WAIT状态问题排查
  18. EDM初级:什么是EDM邮件营销?EDM营销的定义
  19. 论学习大数据什么语言比较合适,不容错过!
  20. BitBlt C++中BitBlt如何使用详解

热门文章

  1. matlab井深测量,一种井深测量系统及方法与流程
  2. java 子类 复制_关于java子类继承来的属性与方法究竟是完全复制还是共用使用...
  3. linux开机自动挂载硬盘指定权限,Linux开机自动挂载硬盘
  4. 织梦手机版list.php,解决织梦一级目录作域名list.php无法跳转到手机站的问题
  5. 队列的基础概念与经典题目(Leetcode题解-Python语言)
  6. 2019吉首大学计算机调剂,吉首大学2019年硕士研究生调剂考生复试情况分学院公示...
  7. mysql脚本的制作_制作脚本实现mysql自动备份
  8. [设计模式]开闭原则
  9. Ticket Game CodeForces - 1215D(博弈题,巴什博弈思维)
  10. Redis基础数据结构内部实现简单介绍