前言
贪心问题,为了找到解决方法,我们可以尝试一些可能的贪心方法。而对于区间的贪心,不外乎就是根据区间的起始端点或者是结束端点进行排序后探索做法。
一、题目陈述
二、解决思路
这道题中,最少点数对应的方案必然是让每一个点能够覆盖的区间最多,那么就可以考虑将区间按照终点从小到大进行排序,设置一个temp
变量存储此时最新的点的坐标位置,变量res
存储需要的点的个数。每当temp
无法覆盖下一个区间的时候,就将temp
设置为下一个区间的终点,同时res++
。
三、代码实现
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
// 区间个数
int n;
struct Seg{
int s,e;
}segs[N];
bool cmp(Seg a,Seg b) {
return a.e<=b.e;
}
int main() {
cin>>n;
for(int i=0;i<n;i++) cin>>segs[i].s>>segs[i].e;
sort(segs,segs+n,cmp);
int res = 0;
int temp = 1e9+10;
for(int i=0;i<n;i++) {
// 如果是temp是初始值 或者 temp小于此区间的起始点从而无法覆盖
if(temp>1e9||temp<segs[i].s) {
res ++;
temp = segs[i].e;
}
}
cout<<res<<endl;
return 0;
}
在进行结构体排序的时候,除了定义cmp函数之外,还可以在结构体中对小于运算符进行重载。语法如下:
struct Seg{
int s,e;
// 运算符重载
bool operator< (const Seg &W)const {
return e < W.e;
}
}segs[N];
sort(segs,segs+n);
总结
这道题是简单的区间贪心,只需要想到将区间按照终点从小到大进行排序即可。