Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 28579 | Accepted: 6263 |
Description
We use Cartesian coordinate system, defining the coasting is the x-axis. The sea side is above x-axis, and the land side below. Given the position of each island in the sea, and given the distance of the coverage of the radar installation, your task is to write a program to find the minimal number of radar installations to cover all the islands. Note that the position of an island is represented by its x-y coordinates.
![](https://i-blog.csdnimg.cn/blog_migrate/f6ffe515205096387436c13c7449b0ed.jpeg)
Figure A Sample Input of Radar Installations
Input
The input is terminated by a line containing pair of zeros
Output
Sample Input
3 2 1 2 -3 1 2 1 1 2 0 2 0 0
Sample Output
Case 1: 2 Case 2: 1
//
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
struct ran
{
double l;
double r;
ran(){l=0,r=0;}
};
int comp(const void *a,const void *b)
{
return (*(ran *)a).l>(*(ran *)b).l?1:-1;
}
int main ()
{
//coo c[1001]=new coo[1001];
ran r[1001];
int n,d;
int cnt=1; int flag=0; int ans=0;
while(scanf("%d%d",&n,&d)==2&&(n||d))
{
int x,y; flag=1;
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
if(d<=0||d<y) flag=0;
if(d>=y)r[i].l=x-sqrt(double(d*d-y*y));
if(d>=y)r[i].r=x+sqrt(double(d*d-y*y));
}
if(!flag) ans=-1;
else{
qsort(r,n,sizeof(r[0]),comp);
//for(int i=0;i<n;i++) cout<<r[i].l<<" "<<r[i].r<<endl;
ans=0; double min=0;
for(int i=0;i<n;i++) //区间重叠的贪心算法
{
int j=i+1; min=r[i].r;
ans++;
while(r[j].l<=min) {if(r[j].r<=min) min=r[j].r;j++; }
i=j-1;
}
}
cout<<"Case "<<cnt++<<": "<<ans<<endl;
}
return 0;
}
//测试数据
2 5 -3 4 -6 3 4 5 -5 3 -3 5 2 3 3 3 20 8 -20 7 -18 6 -5 8 -21 8 -15 7 -17 5 -1 5 -2 3 -9 6 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 7 9 6 10 5 0 0 2 3 0 2 2 3 2 3 0 2 1 3 3 3 1 2 -3 2 2 4 8 5 2 4 -4 4 -3 3 -3 1 -3 0 -1 0 0 5 6 0 3 0 1 2 -3 1 2 1 3 2 1 2 -3 1 2 1 1 2 0 2 2 3 0 2 2 3 4 -5 4 3 4 3 2 3 6 -9 3 -3 1 2 -3 2 2 1 6 2 1 2 1 2 1 2 -3 1 2 1 0 0 1 2 0 2 2 3 0 2 1 3 3 10 1 10 2 3 4 5 3 5 1 10 2 3 4 5 4 7 1 10 2 3 4 5 0 0 3 9 1 10 2 3 4 5 0 0 ================结果 Case 1: 1 Case 2: 2 Case 3: 4 Case 4: 1 Case 5: 1 Case 6: -1 Case 7: 3 Case 8: -1 Case 9: 2 Case 10: 1 Case 11: 1 Case 12: -1 Case 13: -1 Case 14: 2 Case 15: 1 Case 16: 1 Case 17: 1 Case 18: -1 Case 19: -1 Case 20: -1 挥着翅膀的鳖 献上。。。