1 条题解

  • 0
    @ 2024-12-24 9:59:28

    C++ :

    #include<stdio.h>
    #include<stdlib.h>
     
    #define eps 1e-8
    #define zero(x) (((x)>0?(x):(-x))<eps)
     
    struct point
    {
        double x,y;
    }p[100001],convex[100001],p1,p2,minp;
     
    double xmult(point p1,point p2,point p0)
    {
        return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
    }
     
    int graham_cp(const void* a,const void* b)
    {
        double ret=xmult(*((point*)a),*((point*)b),p1);
        return zero(ret)?(xmult(*((point*)a),*((point*)b),p2)>0?1:-1):(ret>0?1:-1);
    }
     
    void _graham(int n,point* p,int& s,point* ch)
    {
        int i,k=0;
        for(p1=p2=p[0],i=1;i<n;p2.x+=p[i].x,p2.y+=p[i].y,i++)
            if(p1.y-p[i].y>eps||(zero(p1.y-p[i].y)&&p1.x>p[i].x))
                p1=p[k=i];
            p2.x/=n;
            p2.y/=n;
            p[k]=p[0];
            p[0]=p1;
            qsort(p+1,n-1,sizeof(point),graham_cp);
            for(ch[0]=p[0],ch[1]=p[1],ch[2]=p[2],s=i=3;i<n;ch[s++]=p[i++])
                for(;s>2&&xmult(ch[s-2],p[i],ch[s-1])<-eps;s--);
    }
     
    int gramham(int n,point* p,point* convex,int maxsize,int dir)
    {
        point* temp=new point[n];
        int s,i;
        _graham(n,p,s,temp);
        for(convex[0]=temp[0],n=1,i=(dir?1:(s-1));dir?(i<s):i;i+=(dir?1:-1))
            if(maxsize||!zero(xmult(temp[i-1],temp[i],temp[(i+1)%s])))
                convex[n++]=temp[i];
        delete []temp;
        return n;
    }
     
    int main()
    {
        int n,i=0,pos;
        double x,y;
        char s[2];
        scanf("%d",&n);
        while(n--)
        {
            scanf("%lf%lf%s",&x,&y,s);
            if(s[0]=='Y')
            {
                p[i].x=x;
                p[i++].y=y;
            }
        }
        n=gramham(i,p,convex,1,0);
        printf("%d\n",n);
        minp=convex[0];
        pos=0;
        for(i=1;i<n;i++)
        {
            if(convex[i].x<minp.x)
            {
                pos=i;
                minp=convex[i];
            }
            else if(convex[i].x==minp.x)
            {
                if(convex[i].y<minp.y)
                {
                    pos=i;
                    minp=convex[i];
                }
            }
        }
        for(i=pos;i<n;i++)
            printf("%.f %.f\n",convex[i].x,convex[i].y);
        for(i=0;i<pos;i++)
            printf("%.f %.f\n",convex[i].x,convex[i].y);
        return 0;
    }
    
    • 1

    信息

    ID
    1553
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者