【codevs1298】凸包周长,计算几何

来源:互联网 发布:页游平台源码 编辑:程序博客网 时间:2024/06/05 11:06

Time:2016.07.19
Author:xiaoyimi
转载注明出处谢谢


传送门
思路:求凸包模板题,找个时间加深理解
代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>#define eps 1e-5using namespace std;int n;struct Vec{    double x,y;    Vec(double X=0,double Y=0){x=X;y=Y;}};typedef Vec Point;Point p[100003],ch[100003];int dcmp(double p){    if (fabs(p)<=eps) return 0;    return p>0?1:-1;}Vec operator +(Vec a,Vec b){return Vec(a.x+b.x,a.y+b.y);}Vec operator -(Vec a,Vec b){return Vec(a.x-b.x,a.y-b.y);}Vec operator *(Vec a,double p){return Vec(a.x*p,a.y*p);}Vec operator /(Vec a,double p){return Vec(a.x/p,a.y/p);}bool operator <(Point a,Point b){return a.x<b.x;}double Cross(Vec a,Vec b){return a.x*b.y-a.y*b.x;}double DisPP(Point a,Point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}double ConvexHull(Point *p,Point *ch,int n){    sort(p,p+n);    int k,sum=0;double ans=0;    for (int i=0;i<n;i++)    {        while (sum>1&&dcmp(Cross(ch[sum-1]-ch[sum-2],p[i]-ch[sum-2]))>=0) sum--;        ch[sum++]=p[i];    }    k=sum;    for (int i=n-2;i>=0;i--)    {        while (sum>k&&dcmp(Cross(ch[sum-1]-ch[sum-2],p[i]-ch[sum-2]))>=0) sum--;        ch[sum++]=p[i];    }    if (n>0) sum--;    for (int i=0;i<sum;i++)        ans+=DisPP(ch[i],ch[(i+1)%sum]);    return ans;}main(){    scanf("%d",&n);    for (int i=0;i<n;i++)        scanf("%lf%lf",&p[i].x,&p[i].y);    printf("%.1lf",ConvexHull(p,ch,n));}
0 0
原创粉丝点击