题目描述
张琪曼等人用时空雷达定位李旭琳所在的空间位置。如图7.3所示,时空雷达装在一条直线上,直线上方是空间海洋,每个人在空间海洋的位置就如同大海中的岛屿,这些人的位置已知,每一个雷达的扫描范围是一个半径为d的圆形区域,问最少需要多少个雷达覆盖所有的人(岛屿)。
输入
输入包括多组测试数据,每组测试数据第一行为两个整数n (1≤n≤1000) 和 d,即岛屿数和雷达扫描半径。随后n行每行两个整数表示岛屿坐标。每组测试数据以空行间隔,所有测试数据以0 0结束。
输出
输出最少需要安装雷达数,每组一行。若无解以-1表示。
样例输入
3 2
1 2
-3 1
2 1
1 2
0 2
0 0
样例输出
Case 1: 2
Case 2: 1
#include <iostream> #include <string> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <vector> #include <queue> #include <deque> #include <map> #define range(i,a,b) for(int i=a;i<=b;++i) #define LL long long #define rerange(i,a,b) for(int i=a;i>=b;--i) #define fill(arr,tmp) memset(arr,tmp,sizeof(arr)) using namespace std; pair<double,double>aa[115]; int n,d; void init(){ } void swap(int&a,int&b){ int tmp=a; a=b; b=tmp; } bool cmp(pair<double,double>a,pair<double,double>b){ return a.second<b.second; } void solve(){ int cas=0; while(cin>>n>>d,n,d){ bool flag=true; double x,y; range(i,0,n-1){ cin>>x>>y; if(!flag)continue; if(y>d){ flag=false; continue; } aa[i].first=(x-sqrt(d*d-y*y)); aa[i].second=(x+sqrt(d*d-y*y)); } cout<<"Case "<<++cas<<": "; if(!flag){ cout<<-1<<endl; continue; } sort(aa,aa+n,cmp); double tmp=-123845;int ans=0; range(i,0,n-1)if(tmp<aa[i].first){ ++ans;tmp=aa[i].second; } cout<<ans<<endl; } } int main() { init(); solve(); return 0; }
原文地址:https://www.cnblogs.com/Rhythm-/p/9344574.html
时间: 2024-11-18 08:27:47