贪心第一题。应该上来先把每个岛屿对应的海岸线范围求好,这样以后就只是加减运算比较方便,否则每次都要算乘方开方。注意无解的情况!不要忘了考虑当currentR >当前点的右界时的情况!
最后注意输入要读完再判断是否为-1,其实没读完也可以判断的。。。
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <cmath>
using namespace std;
struct node{
double l;
double r;
};
bool compare(struct node a,struct node b)
{
return a.l < b.l;
}
int main()
{
int n,d;
int count = 1;
while(scanf("%d %d",&n,&d) == 2 && n != 0)
{
struct node nodes[1024];
memset(nodes,0,sizeof(nodes));
int i,flag = 0;;
for(i = 0;i < n;++i)
{
int x,y;
scanf("%d %d",&x,&y);
if(d < y)
{
flag = 1;
}
nodes[i].l = x - sqrt(double(1.0 * d * d - y * y));
nodes[i].r = x + sqrt(double(1.0 * d * d - y * y));
}
if(flag)
{
printf("Case %d: -1\n",count++);
continue;
}
sort(&nodes[0],&nodes[n],compare);
int radars = 1;
double currentR = nodes[0].r;
for(i = 1;i < n;++i)
{
if(currentR < nodes[i].l)
{
++radars;
currentR = nodes[i].r;
}
else if(currentR > nodes[i].r)
currentR = nodes[i].r;
}
printf("Case %d: %d\n",count++,radars);
}
return 0;
}