http://poj.org/problem?id=1328
细心
题意:给出一些点的坐标看至少可以有多少个雷达可以把点全部都覆盖掉。。
#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> using namespace std; struct node { double x,y; double lx,rx; }p[10000]; bool cmp(node p1,node p2) { return p1.x<p2.x; } int main() { int n,d,flag=0,Case=0; while(~scanf("%d%d",&n,&d)) { Case++; if(n==d&&n==0)break; flag=0; for(int i=0;i<n;i++) { scanf("%lf%lf",&p[i].x,&p[i].y); if(p[i].y>d) flag=1; if(flag) continue; p[i].rx=sqrt(d*d-p[i].y*p[i].y)+p[i].x; p[i].lx=p[i].x-sqrt(d*d-p[i].y*p[i].y); } if(flag) {printf("Case %d: -1\n",Case); continue; } sort(p,p+n,cmp); int num=1; double zuo; zuo=p[0].rx; for(int i=1;i<n;i++) { if(p[i].lx>zuo) { num++; zuo=p[i].rx; } else if(p[i].rx<zuo) //注意 { zuo=p[i].rx; } //else 会出现p[i].rx>zuo&&p[i].lx<zuo 时无需改变下标 } printf("Case %d: %d\n",Case,num); } return 0; } ///* //4 5 //-5 3 //-3 5 //2 3 //3 3 //*/
//按R进行从左到右排序 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; struct node { double L,R; } p[1001]; int cmp(node p1,node p2) { return p1.R<p2.R; } int main() { int n,d,num=0; while(cin>>n>>d) { num++; if(n==0&&d==0) break; int flag=0; for(int i=0; i<n; i++) { int u,v; cin>>u>>v; if(d<v) { flag=1; } else if(flag==0) { p[i].L=u-sqrt(d*d-v*v); p[i].R=sqrt(d*d-v*v)+u; } } if(flag) { printf("Case %d: -1\n",num); continue; } sort(p,p+n,cmp); double xR=p[0].R; double xL=p[0].L; int sum=1; for(int i=1; i<n; i++) { if(p[i].L<=xR) { } else if(p[i].L>xR) { xR=p[i].R; sum++; } } printf("Case %d: %d\n",num,sum); } }