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

算法题(155):线段覆盖

审题:

本题需要我们记录不相互覆盖的最大区间个数

思路:
方法一:贪心

涉及到区间的贪心题我们一般先要对区间进行排序,一共分四种排序

1:左端点升序

2:右端点升序

3:左端点降序

4:右断点降序

具体可以采用哪种预处理排序方法取决于题意

以本题的样例为例分析:
我们先尝试左端点升序排序,此时区间1为【0,2】,区间2为【1,3】,区间3为【2,4】。我们看到区间1和2是互相覆盖的,此时我们舍弃掉区间隔2,保留区间1(因为保留右端点更小的区间有更大可能不与后面的区间覆盖,从而得到更多的不覆盖区间)。然后再用区间1和区间3进行比较,发现他们不是互相覆盖,所以answer++,遍历结束,结束搜索。

我们发现左端点升序可以解决该问题,所以我们就采用左端点升序解题。

解题:
 

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e6 + 10;
struct space
{int l;int r;
}a[N];
int n;
bool cmp(space& s1, space& s2)
{return s1.l < s2.l;
}
int main()
{//数据录入cin >> n;for (int i = 1; i <= n; i++){cin >> a[i].l >> a[i].r;}//左端点升序排序sort(a + 1, a + 1 + n, cmp);//区间搜索int answer = 1;int r = a[1].r;for (int i = 2; i <= n; i++){int left = a[i].l;int right = a[i].r;if (left < r){r = min(r, right);}else{answer++;r = right;}}cout << answer << endl;return 0;
}

1.由于每个区间需要存储左右端点,所以我们用结构体来表示区间

2.answer初始化为1:因为不管什么情况,只要有区间,一定会有一个区间是可以单独选出来而不覆盖的(只有一个区间不存在覆盖的问题)

P1803 凌乱的yyy / 线段覆盖 - 洛谷

http://www.xdnf.cn/news/8996.html

相关文章:

  • ADSY1100系统级模块(SOM)4 Tx/4 Rx, 0.1 GHz to 20 GHz
  • 【Java】多线程_创建线程的四种方式
  • 【测试】——AS/400快速入门
  • 可编程幻彩LED灯条的设计
  • Python文件操作完全指南
  • 【TypeScript】结构化类型系统与标明类型系统
  • Linux 内核学习(8) --- 字符设备操作函数
  • SpringBoot中消息转换器的选择
  • some java面试题
  • 第三方检测机构如何凭借专业公正保障软件质量?资质有哪些?
  • ELF文件的作用详解
  • STL 标准模板库全面解析:容器、算法与迭代器的核心应用
  • Eigen 库实现最小二乘算法(Least Squares)
  • 如何用AI实现需求分析
  • Newtonsoft Json序列化数据不序列化默认数据
  • LeetCode 1345 跳跃游戏 IV
  • CentOS7更新 GLIBC 2.25
  • 基于亚博K210开发板——六轴姿态传感器水平测试板验证
  • Java集合使用中的常见错误与最佳实践
  • Oracle 如何实现AI自然语言查询
  • MySQL索引深度解析:从原理到实践
  • STM32的内部FLASH
  • JVM相关
  • 【MPC控制 - 从ACC到自动驾驶】4 MPC的“实战演练”:ACC Simulink仿真与结果深度解读
  • 【Linux】磁盘空间不足
  • vite+vue2安装步骤
  • 使用大模型预测亚急性脊髓联合变性(SCD)的技术方案大纲
  • x星球请求返回值加密
  • 《计算机组成原理》——第二章-10 现代计算机的总线结构
  • 大模型记忆法