南阳理工学院OJ_287_Radar
此题意思给定点集S={(xi,yi)i=1.2.3...n},求用圆心在x轴上,半径为d的圆覆盖S所需的圆的最少个数。
1.先把给出的岛的坐标(xi.yi)和半径r转化为在x轴上的区间,即当d-yi>=0时,圆心位于x轴上的区间为Ii=[ xi-sqrt(d^2-yi^2) , xi + sqrt( d^2 - yi^2 )],则转化为区间选点问题。
2.S中点(xi,yi),对应一个在x轴上的区间Ii=(li,ri),按照区间右端点ri从小到大排序,在区间集合中选择一个索引最小的区间,把选择的区间和与其相交的所有区间作为一组从T中删除,直到T为空集,此时搜到的组数最大
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> using namespace std; struct inteval { double s,e; }p[1005]; bool cmp(inteval a,inteval b) { return a.e<b.e; } int main() { int n,i,t=1; double d,x,y; while(~scanf("%d%lf",&n,&d)) { if(n==0&&d==0) break; for(i=0;i<n;++i) { scanf("%lf%lf",&x,&y); p[i].s=x-sqrt(d*d-y*y); //区间啊区间 p[i].e=x+sqrt(d*d-y*y); } sort(p,p+n,cmp); int len=1; double mark=p[0].e; for(i=0;i<n;++i) { if(p[i].s>mark) { len++; mark=p[i].e; } } printf("Case %d: %d\n",t++,len); } return 0; }