Time:2016.07.19
Author:xiaoyimi
转载注明出处谢谢
传送门
思路:求凸包模板题,找个时间加深理解
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define eps 1e-5
using 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));
}