Radar Installation
poj 1328
题目大意:
在平面直角坐标系的一二象限上有n个小岛,现在让你在x坐标上布置雷达,每个雷达可以侦测以它为原心,半径为m的圆内的所有小岛,现在问侦测完这n个小岛最少要多少个雷达
输入样例
3 2
1 2
-3 1
2 11 2
0 20 0
输出样例
Case 1: 2
Case 2: 1
数据范围
1⩽n⩽10001\leqslant n\leqslant 10001⩽n⩽1000
解题思路:
把每个点可以被哪个范围内雷达侦测到记录下来,然后按范围的最尾端从小到大排序,然后每一次在需要安装雷达的范围的最右端安装雷达,这样可以让更多的点被侦测到
代码:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,t,pp,ans;
double x,y,m,k;
struct rec
{double bg,ed;
}a[1500];
bool cmp(rec x,rec y){return x.ed<y.ed||x.ed==y.ed&&x.bg<=y.bg;}
int main()
{scanf("%d %lf",&n,&m);while(n){++t;pp=0;for (int i=1;i<=n;++i){scanf("%lf %lf",&x,&y);if (y>m) pp=1;a[i].bg=x-sqrt(m*m-y*y);//计算范围a[i].ed=x+sqrt(m*m-y*y);}if (pp)//离x轴的坐标大于m则无解{printf("Case %d: -1\n",t);scanf("%d %lf",&n,&m);continue;}sort(a+1,a+1+n,cmp);//排序ans=1;k=a[1].ed;//最后面的雷达for (int i=2;i<=n;++i)if (a[i].bg>k)//没有被侦测到ans++,k=a[i].ed;//新建一个printf("Case %d: %d\n",t,ans);scanf("%d %lf",&n,&m);}
}