http://poj.org/problem?id=1328
按右端点升序排序。
贪心,每次贪心选取“右端点”,实在取不到交集,雷达个数才加一。
然后再贪心的选取“右端点”,重复上述过程。
<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>
#include <math.h>//gcc -o xxx xxx.c -lm
typedef struct node
{
double x,y;
}Node;
int compare(const void*elem1,const void* elem2)
{
Node*p1,*p2;
p1=(Node*)elem1;
p2=(Node*)elem2;
if((p1->y==p2->y))//主序相等
{
if((p1->x-p2->x)>0)
return 1;
else if((p1->x-p2->x)==0)
return 0;
else
return -1;
}
else if((p1->y-p2->y)<0)
return -1;//主序按区间右端点升序排序
else
return 1;
}
int main()
{
int n,d,t1,t2,i,tag,count=1,num;
double t,temp;
Node section[1005];//雷达区间
while(scanf("%d %d",&n,&d)!=EOF)
{
if(n==0||d==0)
break;
tag=0;
if(d<0)//雷达辐射半径小于0
tag=1;
for(i=0;i<n;i++)
{
scanf("%d %d",&t1,&t2);//岛屿坐标
t=sqrt(d*d-t2*t2);
section[i].x=t1-t;
section[i].y=t1+t;
if(t2>d||t2<0)//岛屿纵坐标超过辐射半径,岛屿纵坐标小于0
tag=1;
}
if(tag)
{
printf("Case %d: -1\n",count++);
continue;
}
qsort(section,n,sizeof(Node),compare);
temp=section[0].y;
num=1;
for(i=1;i<n;i++)
{
if(section[i].x>temp)
{
num++;
temp=section[i].y;
}
}
printf("Case %d: %d\n",count++,num);
}
return 0;
}
</span>