题意:
x轴上方是海,其中有n个岛屿,需要在x轴上安装雷达,半径为d,问最少需要多少。
思路:
可以先确定每一个岛屿能接受雷达的范围,也就是在半径d下边与x轴的交点,然后按
照交点大的依次遍历,哪些可以直接覆盖就直接标记。
不知道为什么G++过不了,C++可以。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
class Node
{
public:
double x,y;
}point[1005],dis[1005];
int cmp(Node a,Node b)
{
return a.y < b.y;
}
int n;
double d;
int main()
{
//freopen("in.txt","r",stdin);
int ncase = 1;
while(cin>>n>>d){
if(n == 0)
break;
double dy = 0;
for(int i = 0;i < n; i++){
cin>>point[i].x>>point[i].y;
if(point[i].y > dy)
dy = point[i].y;
}
getchar();
getchar();
cout<<"Case "<<ncase++<<": ";
if(dy > d || d < 0){
cout<<"-1"<<endl;
continue;
}
for(int i = 0;i < n; i++){
double len = sqrt(d*d-point[i].y*point[i].y);
dis[i].x = point[i].x - len;
dis[i].y = point[i].x + len;
}
sort(dis,dis+n,cmp);
int visit[1005];
memset(visit,0,sizeof(visit));
int ans = 0;
for(int i = 0;i < n; i++){
if(!visit[i]){
visit[i] = true;
for(int j = 0;j < n; j++){
if(!visit[j] && dis[j].x <= dis[i].y){
visit[j] = true;
}
}
ans++;
}
}
cout<<ans<<endl;
}
return 0;
}