题目:http://poj.org/problem?id=1328
题意:给出岛的坐标,都在X轴上方,雷达在X 轴上,给出其覆盖的半径D。求出覆盖所有小岛的最少雷达,若无法实现则输出 -1。
思路:以每一个小岛为圆心画半径为D 的圆,圆与X轴相交的 直线的前后坐标记录下来。将各小岛线段共有的区间记录,更改区间,一旦此区间与后一条线段没有共有的部分,则更新区间,进行另外一个圆的计算。
CODE
#include <iostream>
#include<stdio.h>
#include<algorithm>
#include<cmath>
const int M=1005;
using namespace std;
struct Stu
{
double a,b;
}S[M];
bool cmp(Stu aa,Stu bb)
{
return aa.a<bb.a;
}
int main()
{
//freopen("in.in","r",stdin);
int N,D,T=0;
while(~scanf("%d%d",&N,&D),N,D)
{
T++;
double x,y;
int k=0,ok=0;
for(int i=0;i<N;i++)
{
scanf("%lf%lf",&x,&y);
if(y>D) ok=1;
if(y<=D)
{
double len=sqrt(D*D-y*y);
S[k].a=x-len;
S[k].b=x+len;
k++;
}
}
if(ok)
{
printf("Case %d: -1\n",T);
continue;
}
sort(S,S+N,cmp);
int ans=0;
int t=0,j;
double f=S[0].a,r=S[0].b;
for(int i=0;i<N;)
{
for(j=t;j<N;j++)
{
if(r<S[j].a)
{
f=S[j].a; r=S[j].b;
break;
}
else
{
f=max(f,S[j].a);
r=min(r,S[j].b);
}
}
ans++;
t=j;
i=j;
}
printf("Case %d: %d\n",T,ans);
}
return 0;
}