hdu 1392 Surround the Trees(凸包模板题)

来源:互联网 发布:照片制作软件下载 编辑:程序博客网 时间:2024/06/05 08:29


hdu 1392 Surround the Trees


凸包模板直接套,注意n==2的时候只算一半

#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;#define MAXN 105struct point{    int x,y;    bool operator < (const point &a) const    {        if(a.x==x) return y<a.y;        else return x<a.x;    }};struct vector{    int x,y;    vector(int x,int y):x(x),y(y){}};vector operator - (point a,point b){    return vector(a.x-b.x,a.y-b.y);}int cross(vector a,vector b){    return a.x*b.y-a.y*b.x;}double getlen(point a,point b){    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}int convex_hull(point *p,int n,point *ch){    sort(p,p+n);    int m=0;    for(int i=0;i<n;i++)    {        while(m>1&&cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<0) m--;        ch[m++]=p[i];    }    int k=m;    for(int i=n-2;i>=0;i--)    {        while(m>k&&cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<0) m--;        ch[m++]=p[i];    }    if(n>1) m--;    return m;}int main(){    point p[MAXN],ch[MAXN];    int n;    while(scanf("%d",&n)!=EOF&&n)    {        for(int i=0;i<n;i++)            scanf("%d%d",&p[i].x,&p[i].y);        int m=convex_hull(p, n, ch);        double ans=0;        for(int i=0;i<m;i++)            ans+=getlen(ch[i], ch[(i+1)%m]);        if(n==2) ans/=2.0;        printf("%.2lf\n",ans);    }    return 0;}


0 0