#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct pointt
{
int x,y;
pointt()
{}
};
pointt point[6000],tubao[6000];
pointt operator-(pointt a, pointt b)
{
pointt c;
c.x = a.x - b.x; c.y = a.y - b.y;
return c;
}
double dot(pointt a, pointt b)
{
return a.x*b.y - a.y*b.x;
}
double dist(pointt a, pointt b)
{
double kk = (double)((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
return sqrt(kk);
}
struct linee
{
pointt p1, vec;
linee(pointt a, pointt b) :p1(a), vec(b - a)
{}
linee()
{}
};
linee shape[6000];
bool com(pointt a, pointt b)
{
double t = dot(a-point[0], b-point[0]);
if (t == 0)
return dist(a, point[0]) < dist(b, point[0]);
return t > 0;
return false;
}
bool isonleft(pointt test, linee std)
{
pointt c = test - std.p1;
return dot(c, std.vec) <=0;
}
int n;
double ans;
void graham()
{
sort(point + 1, point + n + 1, com);
//for (int i = 1; i <= n; i++)
//{
// cout << "x:" << point[i].x << " " << "y:" << point[i].y << endl;
//}
tubao[0] = point[1]; tubao[1] = point[2]; //shape[0] = linee(tubao[0], tubao[1]);
int last = 1;
for (int i = 3; i <= n; i++)
{
while (last >= 1 && isonleft(tubao[last], linee(tubao[last - 1], point[i])))last--;
tubao[++last] = point[i];
}
for (int i = 1; i <= last; i++)
{
ans += dist(tubao[i], tubao[i - 1]);
if (i == last)
ans += dist(tubao[0], tubao[i]);
}
}
int main()
{
scanf("%d", &n);
pointt min;
min.x = 1000000000; min.y = 1000000000;
for (int i = 1; i <=n; i++)
{
int a, b;
scanf("%d%d", &a, &b);
point[i].x = a; point[i].y = b;
if (b < min.y || (b == min.y&&a < min.x))
min = point[i];
}
point[0] = min;
graham();
printf("%.2lf\n", ans);
}
08-13