#include<bits/stdc++.h>#define M 20009 usingnamespace std;struct point{double x,y;point(double a=0,double b=0){x=a,y=b;}friendinline point operator+(const point &a,const point &b){returnpoint(a.x+b.x,a.y-b.y);}friendinline point operator-(const point &a,const point &b){returnpoint(a.x-b.x,a.y-b.y);}friendinlinedoubleoperator*(const point &a,const point &b){return a.x*b.y-a.y*b.x;}friendinlinedoubleoperator^(const point &a,const point &b){return a.x*b.x+a.y*b.y;}inlinedoubledist(){returnsqrt(x*x+y*y);}}p[M],q[M];int last,n;boolcmp(const point &a,const point &b){double res=(a-p[1])*(b-p[1]);if(res)return res>0;return(a-p[1]).dist()<(b-p[1]).dist();//如果三点过线,需要特判 }voidgraham(){int dat=1;for(int i=2;i<=n;i++)if(p[i].x<p[dat].x||p[i].x==p[dat].x&&p[i].y<p[dat].y)
dat=i;//选取极点 swap(p[dat],p[1]);sort(p+2,p+1+n,cmp);
q[++last]=p[1];//单调栈维护 for(int i=2;i<=n;i++){while(last>2&&(p[i]-q[last-1])*(q[last]-q[last-1])>=0) last--;//依次扫描并丢去无用的点
q[++last]=p[i];}}doublecalc(){double ans=0;
ans+=(q[last]-q[1]).dist();while(last>1){
ans+=(q[last]-q[last-1]).dist();
last--;}return ans;}intmain(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);graham();printf("%.2lf",calc());return0;}