当前位置: 首页 > news >正文

区间分组详解

步骤

按照左端点排序原因(个人理解):让每个组的区间都排列的更加紧密,并且如果按照右端点排序,而不知道左端点的位置,可能造成误差

priority_queue<int>表示一个大根堆,队列的顶部存储的是最大的元素。

priority_queue<int, std::vector<int>, std::greater<int>>表示一个小根堆,队列的顶部存储的是最小的元素。

判断是否需要添加一个新组

 if (heap.empty() || heap.top() >= r.l) heap.push(r.r);//堆是空的或者堆顶的值大于该区间的左端点,需要开一个新组else{heap.pop();//删掉堆顶heap.push(r.r);//把当前的新的右端点加入堆}

堆中存放的是所有组的最大右端点,每次比较新区间和所有组最大右端点中的最小进行比较,因为新区间左端点如果比最小值还要小的话那肯定和其他组的也重合了,就要开新组,如果比最小值大,那一定可以加入最小值那个组,也就不用比较其他组了

AC代码

#include <iostream>
#include <algorithm>
#include <queue>using namespace std;const int N = 100010;int n;
struct Range
{int l, r;bool operator< (const Range &W)const{return l < W.l;}
}range[N];int main()
{cin>>n;for (int i = 0; i < n; i ++ ){int l, r;cin>>l>>r;range[i] = {l, r};}sort(range, range + n);priority_queue<int, vector<int>, greater<int>> heap;//小根堆,用来存储所有组的右端点最大值,堆顶存储的是目前所有组中最小的右端点for (int i = 0; i < n; i ++ ){auto r = range[i];if (heap.empty() || heap.top() >= r.l) heap.push(r.r);//堆是空的或者堆顶的值大于该区间的左端点,需要开一个新组else{heap.pop();//删掉堆顶heap.push(r.r);//把当前的新的右端点加入堆}}cout<<heap.size();//堆的大小就是组的个数return 0;
}

相关文章:

  • 83k Star!n8n 让 AI 驱动的工作流自动化触手可及
  • 使用Spark-TTS-0.5B模型,文本合成语音
  • Lua 第7部分 输入输出
  • React.cloneElement的用法详解
  • Flowable 与 bpmn.io@7.0 完整集成示例 Demo
  • 解决IntelliJ IDEA配置文件(application.properties)中文注释变成乱码的问题
  • 明远智睿2351开发板:四核1.4G处理器——开启高效能Linux系统新纪元
  • 耀百岁中医养生与上海隽生中医药研究中心达成战略合作——共筑中医养生科研创新高地
  • 【JavaEE】-- MyBatis操作数据库(1)
  • spring中使用netty-socketio部署到服务器(SSL、nginx转发)
  • STM32F103C8T6 HAL库 U盘模式(MSC)
  • Pycharm(十五)面向对象程序设计基础
  • Linux 内核中 cgroup 子系统 cpuset 是什么?
  • 【专题刷题】滑动窗口(三)
  • 【系统架构设计师】嵌入式微处理器
  • 2025-04-22| Docker: --privileged参数详解
  • Ansys Zemax | 在 MATLAB 中使用 ZOS-API 的技巧
  • 最美丽的区间
  • Trino分布式 SQL 查询引擎
  • [Java · 铢积寸累] 数据结构 — 数组类型 - 概念引入
  • 习近平同俄罗斯总统普京举行会谈
  • 商务部再回应中美经贸高层会谈:美方要拿出诚意、拿出行动
  • 民生访谈|今年上海还有哪些重要演出展览?场地配套如何更给力?
  • 高进华“控股”后首份年报出炉,史丹利账上可动资金大幅缩水
  • 国新办将于5月8日10时就《民营经济促进法》有关情况举行新闻发布会
  • 大学2025丨专访清华教授沈阳:建议年轻人每天投入4小时以上与AI互动