POJ 1328

//花了一上午时间做这道题,还是没想出来咋做。。。,看了别人的博客后,才知道,原来是这样做的。先以每个岛为圆心划圆,记录其与X轴的交点,分别记为去去q[i].x,q[i].y,让后在以左交点排序。让后在扫描一遍,接下来就是纯数学了//

#include<stdio.h>
#include<math.h>
struct node
{
    double a;
    double b;
} q[10000];
int main()
{
    int n,d;
    int k=1;
    int sum;
    while(scanf("%d%d",&n,&d)!=EOF&&(n||d))
    {
        int i,j;
        int x,y;
        int flag=0;
        sum=1;
        for(i=0; i<n; i++)
        {
            scanf("%d%d",&x,&y);
            if(y>d)
                flag=1;
            q[i].a=x-sqrt((double)(d*d-y*y));
            q[i].b=x+sqrt((double)(d*d-y*y));


        }
        if(flag)
        {
            printf("Case %d: %d\n",k++,-1);
            continue;
        }
        double tmp,temp;
        for(i=0; i<n; i++)
        {
            for(j=0; j<n-i-1; j++)
            {
                if(q[j].a>q[j+1].a)
                {
                    tmp=q[j].a;
                    q[j].a=q[j+1].a;
                    q[j+1].a=tmp;
                    tmp=q[j].b;
                    q[j].b=q[j+1].b;
                    q[j+1].b=tmp;
                }
            }
        }
        temp=q[0].b;
        for(i=1; i<n; i++)
        {
            if(q[i].a>temp)
            {
                sum++;
                temp=q[i].b;
            }
            else if(q[i].b<temp)
            {
                temp=q[i].b;
            }
        }
        printf("Case %d: %d\n",k++,sum);
    }
    return 0;
}

你可能感兴趣的:(POJ 1328)