给定n个开区间,从中选择尽可能多的开区间,使得这些开区间两两没有交集。
给定n个闭区间,问最少需要确定多少个点,才能使每个闭区间中都至少存在一个点。
解题思路:
利用贪心思想,先将这些区间排序,按右端点最大的优先来排序,如果右端点相同,那么取左端点小的,这样区间短。
然后取第一个的作为第一个取的区间,然后比较剩余区间里的,如果有其中的一个左端点大于等于已去区间的右端点,那么就应该纳入,这样就可以不相交。
而对于区间选点问题,我们只需要在区间不相交问题中,小小修改,修改纳入区间条件:if(num[i].left>=num[templeft].right),只需要把等号去掉。理由是,我们每次取区间的左端点作为选取的点,这样就可以小区间内的点也覆盖了大区间内的点。读者可以自己画个图理解一下。
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
struct node{
int left;
int right;
};
int cmp(node n1,node n2){//以右边短的作为排序,优先选区间小的
if(n1.right!=n2.right)
return n1.right<n2.right;
else return n1.left>n2.left;
}
int main(){
int n;
cin>>n;
node num[n];
for(int i=0;i<n;i++){
cin>>num[i].left>>num[i].right;
}
sort(num,num+n,cmp);
int count = 1;
int templeft = 0;
for(int i=1;i<n;i++){
if(num[i].left>=num[templeft].right){
count++;
templeft = i;
}
}
cout<<count<<endl;
return 0;
}