区间选点问题-贪心-C++

问题:

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

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

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

输入格式

第一行包含整数 𝑁,表示区间数。

接下来 𝑁 行,每行包含两个整数 𝑎𝑖,𝑏𝑖,表示一个区间的两个端点。

输出格式

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

数据范围

1≤N≤10^5,
−10^9≤𝑎𝑖≤𝑏𝑖≤10^9

输入样例:
复制代码
3
-1 1
2 4
3 5

代码:

cpp 复制代码
#include<iostream>
#include<algorithm>
using namespace std;
using Pii = pair<int, int>;
const int N = 100010;
Pii Range[N];
int main(){
  int n;
  cin >> n;
  for (int i = 0; i < n;i++){
    cin >> Range[i].first >> Range[i].second;
  }
  sort(Range, Range + n, [](const Pii &a, const Pii &b) -> bool
       { return a.second < b.second; });
  int ed = -2e9, res = 0;
  for (int i = 0; i < n;i++){
    if(Range[i].first>ed){
      res++;
      ed = Range[i].second;
    }
  }
  cout << res << endl;
}

题解:
题意就是给你10^5以下个区间,所以我们const int N = 100010;让你在数轴上选择一些点,这些点要能覆盖得到所有的区间,当然了,数量越少越好:

以此图为例子,灰色笔画的这两个点就是答案,你再也不可能找到更少的点来覆盖每个区间了。

计算机并不容易比我们更容易地判断出结果,我们可以先排个序看看:
我们暂且以每个区间的右端点的由小而大来排序,我们如果以每个区间的右端点来设点,其实更有可能让这个点覆盖到下一个区间甚至下下一个区间,这样更可能满足要求,这是贪心的思想,即:短视地选择我们遍历的区间的右端点作为答案,然后妄想让它尽可能地覆盖下一个、下下一个点......

我们还发现:如果A区间的右端点在下一个区间(记为B)的左端点之右的话,那么我们把A区间的右端点放到答案中,它不仅可以覆盖A区间,连B区间都覆盖了,甚至满足条件它连C区间也可以给覆盖了......我们只需维护一个变量ed记为我们刚埋的点,刚开始这个ed我们赋值为负无穷,

遇到一个区间,如果它的左端点比ed还小,那说明不用管它了,ed完全可以覆盖它,否则,说明这一个区间我们ed够不着,需要在这个区间设点了,即把这个区间的右端点作为新的ed,让他去在遍历下一个区间时,看能不能不设点,ed就能覆盖下一个区间。

总之,遇到区间问题,尽量想到排序,贪心.....

参考链接:链接

相关推荐
YoungHong199211 小时前
面试经典150题[072]:从前序与中序遍历序列构造二叉树(LeetCode 105)
leetcode·面试·职场和发展
im_AMBER11 小时前
Leetcode 78 识别数组中的最大异常值 | 镜像对之间最小绝对距离
笔记·学习·算法·leetcode
LYFlied12 小时前
【每日算法】LeetCode 25. K 个一组翻转链表
算法·leetcode·链表
LYFlied15 小时前
【每日算法】LeetCode 19. 删除链表的倒数第 N 个结点
算法·leetcode·链表
努力学算法的蒟蒻17 小时前
day35(12.16)——leetcode面试经典150
算法·leetcode·面试
LYFlied17 小时前
【每日算法】LeetCode 234. 回文链表详解
算法·leetcode·链表
刃神太酷啦17 小时前
C++ list 容器全解析:从构造到模拟实现的深度探索----《Hello C++ Wrold!》(16)--(C/C++)
java·c语言·c++·qt·算法·leetcode·list
承渊政道17 小时前
一文彻底搞清楚链表算法实战大揭秘和双向链表实现
c语言·数据结构·算法·leetcode·链表·visual studio
玉树临风ives19 小时前
atcoder ABC436 题解
c++·算法·leetcode·atcoder·信息学奥赛
圣保罗的大教堂19 小时前
leetcode 2110. 股票平滑下跌阶段的数目 中等
leetcode