区间选点

给定N个闭区间,寻找最小点数覆盖所有区间。通过排序区间并依次判断相邻区间交集,确定新选点。文章讲解了如何利用区间dp解决此问题,包括样例解析和实现代码。
摘要由CSDN通过智能技术生成

题目描述

给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。

输出选择的点的最小数量。

位于区间端点上的点也算作区间内。

样例描述

输入格式
第一行包含整数 N,表示区间数。

接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。

输出格式
输出一个整数,表示所需的点的最小数量。

数据范围
1≤N≤105,
−109≤ai≤bi≤109
输入样例:
3
-1 1
2 4
3 5
输出样例:
2

思路

  1. 将每个区间按右端点从小到大排序
  2. 用结构体来表示区间,然后重载运算符<实现基于右端点排序
  3. 从前往后依次枚举每个区间,如果当前区间的右端点不在后面区间内(具体就是比较当前区间的右端点是否小于下一个区间的左端点,若小于则说明两个区间没有交集),则要新选一个点
  4. 结构体排序那块也可以不重载运算符<,而是通过自定义排序函数如下
bool compare(Range a, Range b){
   
  return a.r < b.r;
}

然后在调用sort时添加这个函数参数即可,sort(range, range + n, compare);</

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值