点击打开链接http://poj.org/problem?id=1328
<pre name="code" class="cpp">#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#define M 1110
using namespace std;
int n;
double r;
typedef struct{
double l;
double r;
}Num;
Num num[M];
bool cmp(Num a,Num b)
{
if(a.r==b.r)
{
return a.l>b.l; // r相同 左端点 大到小
}
else
return a.r<b.r; //按右端点 小到大
}
int sovle()
{
double x,y,k;
int i,j,flag=1;
for(i=0;i<n;i++) //把island的坐标转换成线段 代表 线段内至少要安装一个Radar(点)才能使island被cover
{
cin>>x>>y;
if(y>r)
{
flag=0;
}
num[i].l=x-sqrt(r*r-y*y);
num[i].r=x+sqrt(r*r-y*y);
}
if(!flag) return -1;
sort(num,num+n,cmp);
int ans=0;
k=num[0].r; //为了使一个点能覆盖多的线段 //只要在后续选段的左端点之后即可cover后续线段
ans++; // 按右端点小到大排序后 在保证第一条线段被cover 点不断右移可能cover到更多的线段
for(i=1;i<n;i++)
{
//选的点已经在后续线段的右端点之前 只要在后续选段的左端点之后即可
if(num[i].l>k)
{
ans++;
k=num[i].r;
}
}
return ans;
}
int main()
{
int i,cas=0;
while(1)
{
cas++;
cin>>n>>r;
if(n==0&&r==0) break;
int k=sovle();
printf("Case %d: %d\n",cas,k);
}
return 0;
}