区间相交问题 时间限制:1000MS 内存限制:1000K 题型: 编程题 语言: 无限制 Description给定x轴上n个闭区间,去掉尽可能少的闭区间,使剩下的闭区间都不相交。 注意:这里,若区间与另一区间之间仅有端点是相同的,不算做区间相交。例如,[1,2]和[2,3]算是不相交区间。 输入格式第一行一个正整数n(n<=50),表示闭区间数。接下来n行中,每行2个整数,表示闭区间的2个整数端点。输出格式输出去掉的最少的闭区间数。
输入样例310 20 10 15 12 15 输出样例2
自己写的代码: #include <stdio.h>
以下是别人的代码与分析:
个人分析:该问题毫无疑问用贪心算法解决。其实该问题和会议安排是一个样子的,我用一个结构体来保存各个区间的始点和终点,Reg[i].left 和 Reg[i].right 。为了解决该题,需要把每个区间的终点进行排序,这里我用了C语言中的qsort函数对其进行排序。然后就是统计了,如果第一个区间的终点小于第二个区间的始点,那说明它是独立的,依此类推则可解决。最后用
#include "stdio.h"
#include "stdlib.h"
struct Region
{
int left;
int right;
}Reg[5002];
int cmp(const void *a,const void *b)
{
return ((struct Region *)a)->right - ((struct Region *)b)->right;
}
int main()
{
int n;
int i,a,b,count=1,begin;
scanf("%d",&n);
for(i=0;i
{
scanf("%d%d",&a,&b);
Reg[i].right=b;
Reg[i].left=a;
}
qsort(Reg,n,sizeof(Reg[0]),cmp); //把区间终点从小到大排序
//下面开始统计独立的区间数
begin=Reg[0].right;
for(i=1;i
{
if(begin <= Reg[i].left) //注意是 <= 因为两个区间的终点和始点在一起是算独立的
{
begin=Reg[i].right;
count++;
}
}
printf("%d\n",n-count);
return 0;
}
|
区间相交问题
最新推荐文章于 2018-07-19 11:13:22 发布