http://poj.org/problem?id=1328
题目大意:在直角坐标系中有N个点 用半径为R 圆心在X轴上的圆去覆盖这些点 求最小需要的圆的个数
解题思路:如果有点的走坐标大于R那么必然有点无法覆盖 输出-1
对所有的点求能覆盖这个点的圆的圆心坐标在X轴上的左右极限 题目就被转化为求在N个区间中 用最少的点使得每个区间内最少有一个点
首先 对所有区间的按照左端点进行升序排列 如果一个区间的左端点大于当前的点 那么新建一个点在这个区间的右端点
如果一个区间的左端点小于等于当前的点 那么当前的点变成这个区间的右端点和当前点中比较小的点
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct Node
{
double x,y;
double l,r;
}node[1001];
bool cmp(Node x,Node y)
{
return x.l<y.l;
}
int main()
{
int n,i,k,t=1,num;
double d;
double a;
while(scanf("%d %lf",&n,&d)!=EOF)
{
if(n==0)
break;
for(i=1;i<=n;i++)
scanf("%lf %lf",&node[i].x,&node[i].y);
k=0;
for(i=1;i<=n;i++)
{
if(node[i].y>d)
{
k=1;
printf("Case %d: -1\n",t++);
break;
}
}
if(k==0)
{
for(i=1;i<=n;i++)
{
node[i].l=(double)(node[i].x-(double)sqrt(d*d-node[i].y*node[i].y));
node[i].r=(double)(node[i].x+(double)sqrt(d*d-node[i].y*node[i].y));
}
sort(node+1,node+1+n,cmp);
a=node[1].r;
num=1;
for(i=2;i<=n;i++)
{
if(a<node[i].l)
{
num++;
a=node[i].r;
}
else
a=min(node[i].r,a);
}
printf("Case %d: %d\n",t++,num);
}
}
return 0;
}