【贪心】AcWing 803. 区间选点
创始人
2024-05-13 04:55:10

905. 区间选点

文章目录

  • 题目描述
    • 输入格式:
    • 输出格式:
    • 数据范围
    • 输入样例
    • 输出样例
  • 方法:贪心
    • 解题思路
    • 代码
    • 复杂度分析:

题目描述

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

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

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

输入格式:

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

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

输出格式:

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

数据范围

  • 1≤N≤1051≤N≤10^51≤N≤105
  • −109≤ai≤bi≤109-10^9≤a_i≤b_i≤10^9−109≤ai​≤bi​≤109

输入样例

3
-1 1
2 4
3 5

输出样例

2

方法:贪心

解题思路

贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。

  1. 将所有区间按右端点从小到大排序
  2. 维护点设置为负无穷,依次搜索每个区间
    如果新区间的左端点 > 维护点,则将维护值更新成新区间的右端点;
    如果新区间的右端点 <= 维护点,则说明维护点也在这个新区间内。
    在这里插入图片描述

Tips

  • 这里保存区间的左右端点采用了 struct 类型,按区间右端点进行排序需要对 struct 类型的数组自定义排序
//定义结构体
struct Type{int a;double b;//升序需要的操作符函数bool operator < (const Type& right) const {return a < right.a;}//asscend//降序需要的操作符函数bool operator > (const Type& right) const{return a > right.a;}//descend
};

代码

#include 
#include using namespace std;const int N = 100010;
int n;struct Range {int l, r;bool operator < (const Range &W) const {return r < W.r;};
}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);int res = 0, ed = -2e9;for(int i = 0; i < n; i++) if(range[i].l > ed) {res++;ed = range[i].r;}cout << res;return 0;
}

复杂度分析:

  • 时间复杂度:O(nlog2n)O(nlog_2n)O(nlog2​n)
  • 空间复杂度:O(n)O(n)O(n)

相关内容

热门资讯

猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...