题意:用最少的雷达覆盖全部的岛屿。
思路:先求出每个点的雷达在x轴上的范围,定义left和right,按left从小到大排序,然后以第一个点为标准,从第二个点开始,分三种情况讨论。建议用c++提交,用到了while(cin>>n>>d)
1.a[i].right<right
2.a[i].f<right
3.a[i].f>right
样例:
3 2 1 2 -3 1 2 1 1 2 0 2 0 0
#include<iostream> #include<algorithm> #include<math.h> #include<stdio.h> using namespace std; struct T { double f,e; //int v; } a[1005]; bool cmp(T x,T y) { if(x.f==y.f) return x.e>y.e; else return x.f<y.f; } int main() { int n,tt=1,t=0; double d,x,y,l; while(cin>>n>>d) { t=0; if(n==0&&d==0) break; if(d<=0) { t=1; } for(int i=0; i<n; ++i) { cin>>x>>y; if(y<0||y>d) { t=1; continue; } l=sqrt(d*d-y*y); a[i].f=x-l; a[i].e=x+l; //a[i].v=0; } if(t==1) { printf("Case %d: %d\n",tt,-1); tt++; continue; } sort(a,a+n,cmp); int ans=1; double end=a[0].e; for(int i=1; i<n; ++i) { if(a[i].e<end) { end=a[i].e; } else if(a[i].f>end) { ans++; end=a[i].e; } /* if(a[i].v==0) { end=a[i].e; int j=i+1; while(a[j].f<end&&j<n) { a[j].v=1; j++; } } */ //i=j-1; //ans++; //int j=i+1; /* while((a[j].f<a[i].e)&&(j<n)) { j++; } i=j-1; */ } /* for(int i=0; i<n; ++i) { if(a[i].v==0) ans++; } */ printf("Case %d: %d\n",tt,ans); tt++; } return 0; }