题目大意:求凸包的周长……
题解:emm
我的收获:2333
#include <bits/stdc++.h>
using namespace std;
#define N 5005
int n;
double ans;
struct Point{
double x,y;
Point(){}
Point(double _,double __){x=_,y=__;}
void read(){scanf("%lf%lf",&x,&y);}
}p[N],ch[N];
inline bool cmp(Point a,Point b){return a.x<b.x||(a.x==b.x&&a.y<b.y);}
Point operator - (Point A,Point B){return Point(A.x-B.x,A.y-B.y);}
double Cross(Point A,Point B){return A.x*B.y-A.y*B.x;}
double Dot(Point A,Point B){return A.x*B.x+A.y*B.y;}
inline double dis(Point A,Point B){return Dot(A-B,A-B);}
void ConvexHull(){
sort(p,p+n,cmp);//按照x、y为第一、二关键字排序
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--;
for(int i=0;i<m;i++) ans+=sqrt(dis(ch[i],ch[i+1]));
}
void work()
{
ConvexHull();
printf("%.2lf\n",ans);
}
void init()
{
scanf("%d",&n);
for(int i=0;i<n;i++) p[i].read();
}
int main()
{
init();
work();
return 0;
}