一、题目
设有N个格式为 {左端点L,右端点R} 的 开区间,找出使所有区间线段互不相交的最大集合,输出集合中的区间数及这些区间。
输入样例:
12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
输出样例:
5
1 3
3 4
5 10
10 15
15 19
二、思路:
将所有区间,按左端点从大到小排序,左端点相同者,按右端点从小到大排序;
第一个区间有最大的左端点值,一定在最大不相交区间序列中,直接放入ans[]中;
后续区间,若右端点值<=ans[]中前一个放入的区间左端点值,即不相交,放入序列中;
三、代码实现
#include <stdio.h>
#include <stdlib.h>
typedef struct
{ int L,R; }Interval;
int cmp(const void * a,const void * b)
{
if( (*(Interval *)a).L != (*(Interval *)b).L )
return (*(Interval *)b).L - (*(Interval *)a).L;
else return (*(Interval *)a).R - (*(Interval *)b).R;
}
int main()
{
int N,n=0;
scanf("%d",&N);
Interval L[N],ans[N];
for(int i=0 ; i<N ; i++)
scanf("%d %d",&L[i].L,&L[i].R);
qsort(L,N,sizeof(Interval ),cmp);
for(int i=0 ; i<N ; i++)
if( !i || L[i].R <= ans[n-1].L )
ans[n++]=L[i];
printf("d%s",n,!n ? "":"\n");
for(int i=n-1 ; i>=0 ; i--)
printf("%d %d%s",ans[i].L,ans[i].R,i ? "\n":"");
}