题目描述
给定x 轴上n个闭区间。去掉尽可能少的闭区间,使剩下的闭区间都不相交。
给定n个闭区间,计算去掉的最少闭区间数。
输入
输入数据的第一行是正整数n(n≤100),表示闭区间数。接下来的n行中,每行有2 个整数,分别表示闭区间的2个数端点。
输出
将计算出的去掉的最少闭区间数输出
样例输入
3
10 20
10 15
20 15
样例输出
2
参考代码
#include<stdio.h>
#include<stdlib.h>
struct closed_interval
{
int left,right;
int leng;
}
;
int comp(const void *p, const void *q);
main()
{
struct closed_interval *array;
int num,count,i,j,left,right;
scanf("%d",&num);
array = (struct closed_interval *)malloc(num * sizeof(struct closed_interval));
for (i = 0; i < num;i++)
{
scanf("%d",&left);
scanf("%d",&right);
if(left < right)
{
array[i].left = left;
array[i].right = right;
} else
{
array[i].left = right;
array[i].right = left;
}
array[i].leng = 0;
for (j = 0; j < i; j++)
if(array[j].left <= array[i].left && array[j].right >= array[i].left || array[j].left <= array[i].right && array[j].right >=array[i].right)
{
array[j].leng++;
array[i].leng++;
}
}
count = 0;
qsort(array,num - 1,sizeof(struct closed_interval),comp);
while(array[0].leng)
{
for (i = 1; i <= array[0].leng; i++)
array[i].leng--;
array[0].leng = 0;
count++;
qsort(array,num - 1,sizeof(struct closed_interval),comp);
}
printf("%d",count);
}
int comp(const void *p, const void *q)
{
return (((struct closed_interval *)q)->leng - ((struct closed_interval *)p)->leng);
}
解析
暂无