目录
一、区间贪心题目:
给定若干个开区间,可任意选择区间要求最大不相交区间的数量,例如对于开区间(1,3)、(2,4,)、(3,5)、(6,7)来说最多可以选择三个区间 (1,3)、(3,5)、(6,7)。
二、解决思路
各个
1、区间包含
当我们这个区间包含于另一个区间,这两个区间我们肯定首选区间范围小的那个,比如(1,5)和(2,3) 我们肯定选择(2,3)。
如下图所示,区间范围的那个占有数轴的距离更小,剩余部分任有可能存在区间
2、当区间不相交
我们把所有开区间按照x的大小排序,如果去掉区间包含的情况,那么一定会有y1>y2>y3......>yn成立 如下图:
由图易得,由于每一条线的x从上往下递增,因此这样排序的话每一个开区间占用的数轴范围就会变大,因此假如说按这样排序的两个区间发生冲突优先选择上面的,例如选择y1而不选择y2
三、完整代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=110;
struct intevel{
int x,y;
} p[maxn]; //输入点
bool cmp(intevel a,intevel b){
if(a.x!=b.x) a.x>b.x;
else return a.y<b.y;
} //比较函数
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>p[i].x>>p[i].y;
}
sort(p,p+n,cmp);
int ans=1,lastx=p[0].x;
for(int i=1;i<n;i++){
if(p[i].y<=lastx){
ans++;
lastx=p[i].x;
}
}
cout<<ans<<endl;
return 0;
}