#include<stdio.h>
#include<stdlib.h>
#include<stack>
#include<iostream>
#include<math.h>
using namespace std;
#define ll long long int
struct node
{
ll x,y;
}ar[10005];
node p0;
void swap(node &a,node &b)
{
node temp=a;
a=b;
b=temp;
}
int orientation(node p,node q, node r)
{
ll val=((q.y-p.y)*(r.x-q.x))-((q.x-p.x)*(r.y-q.y));
if(val==0) return 0;
return (val>0)?1:2;
}
ll dist(node p,node q)
{
return ((p.x-q.x)*(p.x-q.x))+((p.y-q.y)*(p.y-q.y));
}
int cmp(const void* g,const void* f)
{
node *p1=(struct node*) g;
node *p2=(struct node*) f;
int o=orientation(p0,*p1,*p2);
if(o==0) return (dist(p0,*p1)<=dist(p0,*p2))? -1:1;
return (o==2)?-1:1;
}
node next_to(std::stack<node> &s)
{
node p1=s.top();
s.pop();
node p2=s.top();
s.push(p1);
return p2;
}
int main()
{
ll n,i,x,y;
scanf("%lld",&n);
for(i=0;i<n;i++)
{
//scanf("%lld%lld",&ar[i].x,&ar[i].y);
cin>>ar[i].x>>ar[i].y;
}
//printf("3.%lld %lld\n",(ll)ar[8424].x,(ll)ar[8424].y);
ll ind=0;
for(i=1;i<n;i++)
{
if(ar[i].y<ar[ind].y||(ar[i].y==ar[ind].y&&ar[i].x<ar[ind].x)) ind=i;
}
//printf("1.%lld %lld %lld\n",ar[0].x,ar[0].y,ind);
swap(ar[0],ar[ind]);
p0=ar[0];
qsort(&ar[1],n-1,sizeof(node),cmp);
ll m=1;
for(ll i=1;i<n;i++)
{
while(i<n-1&&orientation(p0,ar[i],ar[i+1])==0) i++;
ar[m]=ar[i];
m++;
}
std::stack<node> s;
s.push(ar[0]);
s.push(ar[1]);
s.push(ar[2]);
for(i=3;i<m;i++)
{
while(orientation(next_to(s),s.top(),ar[i])!=2)
s.pop();
s.push(ar[i]);
}
node p1=s.top(),p3;
p3=p1;
ll size=s.size();
//printf("%lld",size);
//printf("%lld %lld\n",p1.x,p1.y);
s.pop();
double sum=0.0;
while(!s.empty())
{
node p2=s.top();
//printf("%lld %lld %lld %lld\n",p1.x,p1.y,p2.x,p2.y);
sum+=sqrt((double)dist(p1,p2));
p1=p2;
//printf("%lld %lld\n",p1.x,p1.y);
s.pop();
}
if(size>2) sum+=sqrt((double)dist(p3,p1));
printf("%.1lf\n",sum);
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+CiNpbmNsdWRlPHN0YWNrPgojaW5jbHVkZTxpb3N0cmVhbT4KI2luY2x1ZGU8bWF0aC5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIGxsIGxvbmcgbG9uZyBpbnQKc3RydWN0IG5vZGUKewoJbGwgeCx5Owp9YXJbMTAwMDVdOwpub2RlIHAwOwp2b2lkIHN3YXAobm9kZSAmYSxub2RlICZiKQp7Cglub2RlIHRlbXA9YTsKCWE9YjsKCWI9dGVtcDsKfQppbnQgb3JpZW50YXRpb24obm9kZSBwLG5vZGUgcSwgbm9kZSByKQp7CglsbCB2YWw9KChxLnktcC55KSooci54LXEueCkpLSgocS54LXAueCkqKHIueS1xLnkpKTsKCWlmKHZhbD09MCkgcmV0dXJuIDA7CglyZXR1cm4gKHZhbD4wKT8xOjI7Cn0KbGwgZGlzdChub2RlIHAsbm9kZSBxKQp7CglyZXR1cm4gKChwLngtcS54KSoocC54LXEueCkpKygocC55LXEueSkqKHAueS1xLnkpKTsKfQppbnQgY21wKGNvbnN0IHZvaWQqIGcsY29uc3Qgdm9pZCogZikKewoJbm9kZSAqcDE9KHN0cnVjdCBub2RlKikgZzsKCW5vZGUgKnAyPShzdHJ1Y3Qgbm9kZSopIGY7CglpbnQgbz1vcmllbnRhdGlvbihwMCwqcDEsKnAyKTsKCWlmKG89PTApIHJldHVybiAoZGlzdChwMCwqcDEpPD1kaXN0KHAwLCpwMikpPyAtMToxOwoJcmV0dXJuIChvPT0yKT8tMToxOwp9Cm5vZGUgbmV4dF90byhzdGQ6OnN0YWNrPG5vZGU+ICZzKQp7Cglub2RlIHAxPXMudG9wKCk7CglzLnBvcCgpOwoJbm9kZSBwMj1zLnRvcCgpOwoJcy5wdXNoKHAxKTsKCXJldHVybiBwMjsKfQppbnQgbWFpbigpCnsKCWxsIG4saSx4LHk7CglzY2FuZigiJWxsZCIsJm4pOwoJZm9yKGk9MDtpPG47aSsrKQoJewoJCS8vc2NhbmYoIiVsbGQlbGxkIiwmYXJbaV0ueCwmYXJbaV0ueSk7CgkJY2luPj5hcltpXS54Pj5hcltpXS55OwoJfQoJLy9wcmludGYoIjMuJWxsZCAlbGxkXG4iLChsbClhcls4NDI0XS54LChsbClhcls4NDI0XS55KTsKCWxsIGluZD0wOwoJZm9yKGk9MTtpPG47aSsrKQoJewoJCWlmKGFyW2ldLnk8YXJbaW5kXS55fHwoYXJbaV0ueT09YXJbaW5kXS55JiZhcltpXS54PGFyW2luZF0ueCkpIGluZD1pOwoJfQoJLy9wcmludGYoIjEuJWxsZCAlbGxkICVsbGRcbiIsYXJbMF0ueCxhclswXS55LGluZCk7Cglzd2FwKGFyWzBdLGFyW2luZF0pOwoJCglwMD1hclswXTsKCXFzb3J0KCZhclsxXSxuLTEsc2l6ZW9mKG5vZGUpLGNtcCk7CglsbCBtPTE7Cglmb3IobGwgaT0xO2k8bjtpKyspCgl7CgkJd2hpbGUoaTxuLTEmJm9yaWVudGF0aW9uKHAwLGFyW2ldLGFyW2krMV0pPT0wKSBpKys7CgkJYXJbbV09YXJbaV07CgkJbSsrOwoJfQoJc3RkOjpzdGFjazxub2RlPiBzOwoJcy5wdXNoKGFyWzBdKTsKCXMucHVzaChhclsxXSk7CglzLnB1c2goYXJbMl0pOwoJZm9yKGk9MztpPG07aSsrKQoJewoJCXdoaWxlKG9yaWVudGF0aW9uKG5leHRfdG8ocykscy50b3AoKSxhcltpXSkhPTIpCgkJcy5wb3AoKTsKCQlzLnB1c2goYXJbaV0pOwoJfQoJbm9kZSBwMT1zLnRvcCgpLHAzOwoJcDM9cDE7CglsbCBzaXplPXMuc2l6ZSgpOwoJLy9wcmludGYoIiVsbGQiLHNpemUpOwoJLy9wcmludGYoIiVsbGQgJWxsZFxuIixwMS54LHAxLnkpOwoJcy5wb3AoKTsKCWRvdWJsZSBzdW09MC4wOwoJd2hpbGUoIXMuZW1wdHkoKSkKCXsKCQlub2RlIHAyPXMudG9wKCk7CgkJLy9wcmludGYoIiVsbGQgJWxsZCAlbGxkICVsbGRcbiIscDEueCxwMS55LHAyLngscDIueSk7CgkJc3VtKz1zcXJ0KChkb3VibGUpZGlzdChwMSxwMikpOwoJCXAxPXAyOwoJCS8vcHJpbnRmKCIlbGxkICVsbGRcbiIscDEueCxwMS55KTsKCQlzLnBvcCgpOwoJfQoJaWYoc2l6ZT4yKSBzdW0rPXNxcnQoKGRvdWJsZSlkaXN0KHAzLHAxKSk7CglwcmludGYoIiUuMWxmXG4iLHN1bSk7CglyZXR1cm4gMDsKfQ==