HDU 1392 Surround the Trees 构造凸包

又是一道模板题

 

#include <iostream>

#include <cstring>

#include <cstdlib>

#include <cstdio>

#include <queue>

#include <cmath>

#include <algorithm>



using namespace std;



struct P

{

    int x,y;

    double angle;

} p[50010];



bool cmp(P p1,P p2)

{

    return p1.angle > p2.angle;

}



double calangle(P p,P t)

{

    return ((t.x-p.x)*(t.x-p.x) + 1 - (t.x-p.x-1)*(t.x-p.x-1))/(2*sqrt((t.x-p.x)*(t.x-p.x) + (t.y-p.y)*(t.y-p.y)));

}



P sp[50010];



bool judgesite(P p1,P p2, P p)

{

    P l1,l2;

    l1.x = p2.x - p1.x;

    l1.y = p2.y - p1.y;



    l2.x = p.x - p1.x;

    l2.y = p.y - p1.y;



    return (l1.x*l2.y - l1.y*l2.x) > 0 ? true : false ;

}



double callen(P p1,P p2)

{

    return sqrt( (p1.x-p2.x)*(p1.x-p2.x) + (p1.y-p2.y)*(p1.y-p2.y)   );

}



int main()

{

    int n,i;



    int top;



    double MinLen;



    while(scanf("%d",&n) && n)

    {



        top = 0;



        for(i = 1; i <= n; ++i)

        {

            scanf("%d %d",&p[i].x,&p[i].y);

        }



        P temp;



        for(temp = p[1],i = 2; i <= n; ++i)

        {

            if(temp.y > p[i].y)

            {

                temp = p[i];

            }

            else if(temp.y == p[i].y && temp.x > p[i].x)

            {

                temp = p[i];

            }

        }



        for(i = 1; i <= n; ++i)

        {

            if(temp.x != p[i].x || temp.y != p[i].y)

            {

                p[i].angle = calangle(temp,p[i]);

            }

            else p[i].angle = -2;

        }



        sort(p+1,p+n+1,cmp);



        sp[top++] = p[n];

        sp[top++] = p[1];



        for(i = 2; i <= n;)

        {

            if(judgesite(sp[top-2],sp[top-1],p[i]))

            {

                sp[top++] = p[i];

                ++i;

            }

            else top--;

        }



        top--;//最后一个点重复了



        MinLen = callen(sp[top-1],sp[0]);



        for(i = 1; i < top; ++i)

        {

            MinLen += callen(sp[i-1],sp[i]);

        }



        printf("%.2lf\n",MinLen);

    }

    return 0;

}

 

 

 

你可能感兴趣的:(round)