题意:假设海岸线是一条无限延伸的直线。陆地在海岸线的一侧,而海洋在另一侧。每一个小的岛屿是海洋上的一个点。雷达坐落于海岸线上,只能覆盖d距离,所以如果小岛能够被覆盖到的话,它们之间的距离最多为d。
题目要求计算出能够覆盖给出的所有岛屿的最少雷达数目。
/* 对于每个小岛,按照横坐标从小到大排序,并且求出以小岛坐标为圆心的圆与海岸线的左右交点,给区间即为能覆盖该小岛的区间,然后采用贪心的做法,设一个p值,如果某小岛区间左端点大于p,p更新为该区间右端点,否则,若该区间右端点小于p值,p更新为该区间右端点 */ #include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #define M 1010 using namespace std; struct node { double x,y,l,r; };node a[M]; int cmp(const node&a,const node&b) { return a.x<b.x; } int main() { int n,cnt=0; double rad; while(1) { cnt++; scanf("%d%lf",&n,&rad); if(n==0&&rad==0)break; int flag=0; for(int i=1;i<=n;i++) { scanf("%lf%lf",&a[i].x,&a[i].y); if(a[i].y>rad)flag=1; } if(flag) { printf("Case %d: -1 ",cnt); continue; } sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++) { a[i].l=a[i].x-sqrt(rad*rad-a[i].y*a[i].y); a[i].r=a[i].x+sqrt(rad*rad-a[i].y*a[i].y); } int tot=1; double p=a[1].r; for(int i=2;i<=n;i++) { if(a[i].l>p) { p=a[i].r; tot++; } else if(a[i].r<p) p=a[i].r; } printf("Case %d: %d ",cnt,tot); } return 0; }