博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ3152[Ctsc2013]组合子逻辑——堆+贪心
阅读量:6917 次
发布时间:2019-06-27

本文共 1182 字,大约阅读时间需要 3 分钟。

题目链接:

 

题目大意:

一开始有一个括号包含[1,n],你需要加一些括号,使得每个括号(包括一开始的)所包含的元素个数要<=这个括号左端点那个数的大小,当一个括号包含另一个括号时,里面那个括号内所有数整体被看作是一个元素。
 

 

假设一个括号包含[L,R],它之中有一个括号包含[l,r],那么这段区间长度最长为L+l-1,也就可以看做这段区间前L个被L括起来,后l-1个被l括起来。

那么题目也就可以转化成选择一个数num可以覆盖以他为左端点的往后num个数,询问最少选几个数能覆盖整个数列。

刚开始第一个数一定要选的,那么先往后覆盖a1个数,要想再往后覆盖就要在这前a1个数中再找一个数来继续覆盖下去。

因为要使得所选的数尽量少,所以要选前面中ai最大的。

那么我们用堆维护这个东西,每当一个数ai被覆盖时将它压入堆中,当当前选的数覆盖不了时再在堆顶选取最大的那个继续覆盖下去。

注意ai=1的特判。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;priority_queue
q;int T;int n;int a[2000010];int now;int ans;int flag;int main(){ scanf("%d",&T); while(T--) { while(!q.empty()) { q.pop(); } ans=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } if(n==1) { printf("0\n"); continue; } now=a[1]-1; ans++; flag=0; if(now==0) { printf("-1\n"); continue; } for(int i=2;i<=n;i++) { if(now==0) { now=q.top()-1; q.pop(); if(now==0) { flag=1; break; } ans++; } now--; q.push(a[i]); } if(flag==1) { printf("-1\n"); continue; } printf("%d\n",ans); }}

转载于:https://www.cnblogs.com/Khada-Jhin/p/9790290.html

你可能感兴趣的文章
RBDDriver -1.1.0 driver is uninitialized
查看>>
道哥:我人生有两大选择,为的却都是同一件事
查看>>
Decision Trees 笔记
查看>>
Ajax初学(3)jQuery实现Ajax
查看>>
mysql数据库的优化
查看>>
开发感想 基于8051的数据采集系统(科技)
查看>>
基于S2SH框架的项目—antlr-2.7.2.jar包冲突问题
查看>>
RDIFramework.NET ━ .NET快速信息化系统开发框架 V2.8 版本━新增岗位管理-WinForm部分...
查看>>
kafka-命令行创建topic
查看>>
《数据结构与算法分析——c语言描述》读后笔记
查看>>
windows系统如何查看物理cpu核数,内存型号等
查看>>
salt-key参数
查看>>
最安全的TurboMail邮件系统的安全防范技术介绍
查看>>
通向架构师的道路(第十二天)之Axis2 Web Service(三)
查看>>
我的友情链接
查看>>
pygame转换图片时 No video mode has been set 的错误
查看>>
linux删除某个文件夹下30天前的文件
查看>>
Fragment(碎片)
查看>>
hadoop地址
查看>>
linux
查看>>