poj1328

来源:互联网 发布:杨振宁地位 知乎 编辑:程序博客网 时间:2024/05/22 00:34
/*先求出每个点的左右圆心极限,然后按照左圆心极限递增排序然后后一个与前一个比较,若满足在同一个园内,怎把前一个的左右圆心极限付给后一个*/#include<stdio.h>#include<string.h>#include<algorithm>#include<math.h>using namespace std;#define maxn 1000+10struct point{double x,y;double l,r;}p[maxn];int cmp(const point a,const point b){if(a.l==b.l) return a.r<b.r;return a.l<b.l;}int min(int a,int b){if(a<b) return a;return b;}int max(int a,int b){if(a>b) return a;return b;}int main(){int i,n;int cas=0;int d;while(scanf("%d%d",&n,&d)!=EOF){if(n==0&&d==0) break;int flag=0;for(i=0;i<n;i++){scanf("%lf%lf",&p[i].x,&p[i].y);if(p[i].y>d) flag=1;}if(flag){printf("Case %d: -1\n",++cas);    continue;}        for(i=0;i<n;i++){             p[i].l=p[i].x-sqrt( (d*d-p[i].y*p[i].y) ); p[i].r=p[i].x+sqrt( (d*d-p[i].y*p[i].y) );}sort(p,p+n,cmp);int sum=1;for(i=1;i<n;i++){if(p[i].l<=p[i-1].r){p[i].l=max(p[i].l,p[i-1].l);p[i].r=min(p[i].r,p[i-1].r);}else sum++;}printf("Case %d: %d\n",++cas,sum);}return 0;}