#include <bits/stdc++.h>
using namespace std;
#define db double
#define xi ps[i].x
#define yi ps[i].y
#define xj ps[j].x
#define yj ps[j].y
#define xk ps[k].x
#define yk ps[k].y
const int N = 100005;
int n, mi, top, ni, q[N];
db my, mx, res;
struct pt
{
db x, y;
db mo()
{
db x1 = mx - x,
y1 = my - y;
return sqrt(x1*x1 + y1*y1);
}
db mop(pt p)
{
return sqrt((x-p.x)*(x-p.x) + (y-p.y)*(y-p.y));
}
bool operator < (pt p)
{
db c = (x-mx) / mo();
db cp = (p.x-mx) / p.mo();
return ((abs(c-cp)) > 5e-4 && c > cp) || (abs(c-cp) <= 5e-4 && mo() < p.mo());
}
} ps[N];
inline bool wp(int i, int j, int k)
{
db x1 = xj - xi,
y1 = yj - yi,
x2 = xk - xj,
y2 = yk - yj;
return (x1*y2 - x2*y1) > -5e-4;
}
signed main()
{
freopen("P2742.txt", "r", stdin);
scanf("%d", &n);
my = (db)INT_MAX;
for (int i = 1; i <= n; ++i) {
scanf("%lf%lf", &xi, &yi);
if (yi < my || (yi == my && xi < mx)) {
mi = i;
my = yi;
mx = xi;
}
}
swap(ps[1], ps[mi]);
sort(ps+2, ps+n+1);
q[1] = 1, q[2] = 2, top = 2;
for (ni = 3; ni <= n; ++ni) {
while (!wp(q[top-1], q[top], ni)) q[top--] = 0;
q[++top] = ni;
}
for (int i = 1; i < top; ++i) {
res += ps[q[i]].mop(ps[q[i+1]]);
}
res += ps[q[top]].mop(ps[1]);
if (n >= 2) printf("%.2lf\n", res);
else printf("0.00\n");
return 0;
}
@liangyanbang