版权声明:关中大侠Lv轻侯 https://blog.csdn.net/weixin_44312186/article/details/88538015
题目:给出N个开区间(x,y),从中选择尽可能多的开区间,使得这些开区间两两之间没有交集
例如:(1,3)、(2,4)、(3,5)、(6,7) 最多选3个:(1,3),(3,5)、(6,7)
贪心算法思想:
1、基础两点:
a.优先选择短的区间
b.如果存在一个区间包含另一个区间,应选择更小的区间.
2、算法(左端点为例)
1、对区间左端点进行从大到小排序,左端点相同按右端点从小到大排序
2、依次选出左端点最大的区间,当待选择区间与已选区间集合相交时,舍弃待选区间(相当于将区间排序后从后向前选择区间)
3、首先:排好后的第一个不是原始序列的第一个。其次:每次直接从排好后的第一个开始选,也是为了使左边预留区间最大
//#include<bits/stdc++.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
struct inteval{
int x,y;
}in[100];
bool cmp(inteval a,inteval b){
if(a.x!=b.x) return a.x>b.x;//左区间端点从大到小
else return a.y<b.y; //右区间断点从小到大
}
int main()
{
int n;//n个区间
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d%d",&in[i].x,&in[i].y);
}
sort(in,in+n,cmp);
int ans=1,lastx=in[0].x;//ans记录不相交区间个数,lastx为上一个被选中区间的左端点
for(int i=1;i<n;i++){//从1开始
if(in[i].y<=lastx){
ans++;
lastx=in[i].x;
}
}
printf("%d",ans);
return 0;
}