题目描述:
假设海岸线是一个无限长的直线,陆地位于海岸线的一侧,另一侧是海洋。每个小岛可以看做是海洋中的一个点。在海岸线上安装的任何一个雷达能够覆盖的距离是d,所以如果小岛距离雷达的最大距离是d那么这个小岛就能够被雷达信号覆盖到。
我们使用笛卡尔坐标系,把海岸线看做是X轴,海洋在X轴的上方,陆地在X轴的下方,给出每个小岛在海洋中的位置,并给出雷达的覆盖范围,你的任务是编写程序计算出,如果覆盖所有的小岛至少需要安装多少个雷达。小岛的位置是用x、y坐标表示的。
输入格式
输入包含多组测试数据。对于每组测试数据:
第一行是两个整数n(1≤n≤1000)和d,分别表示小岛的数量n和雷达的覆盖范围d。
接下来n行,每行两个整数,分别表示每个小岛的位置的坐标。
每组测试用例之间用一个空行隔开,当输入为“0 0”时,表示输入结束
输出格式
对于每组测试用例,先输出测试用例的编号,然后输出需要安装的雷达的数量,如果无解输出-1
输入输出样列
输入样例1:
3 2 1 2 -3 1 2 1 1 2 0 2 0 0
输出样例1:
Case 1: 2 Case 2: 1
【耗时限制】1000ms 【内存限制】128MB
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string.h>
#include <sstream>
#include <cstring>
#include <algorithm>
using namespace std;
int d,n,x,y,p;
struct S{
double a,b;
}a[11000000];
bool cmp(const S &x,const S &y){
return x.b<y.b;//函数判断;
}
int main(){
while(cin>>n>>d&&n!=0&&d!=0){
int f=1;
for(int i=1;i<=n;++i){
cin>>x>>y;
if(y>d){
f=0;
continue;
}
a[i].a=x-sqrt(d*d-y*y);//算什么的忘了,就是算三角型的;
a[i].b=x+sqrt(d*d-y*y);
}
if(f==0){
printf("Case %d: %d\n",++p,-1);//输出格式
continue;
}
else {
sort(a+1,a+1+n,cmp);
int ans=1,r=a[1].b;
for(int i=2;i<=n;i++){
if(a[i].a>r){
ans++;
r=a[i].b;
}
}
printf("Case %d: %d\n",++p,ans);
}
}
return 0;
}