#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cctype>
#include<climits>
#include<algorithm>
#include<utility>
#include<string>
#include<deque>
#include<list>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#include<complex>
using namespace std;
#define REP(i,N) for (int i = 0; i < (N); i++)
#define FOR(i,a,b) for (int i = (a); i <= (b); i++)
#define FORI(i,a,b) for (int i = (a); i < (b); i++)
#define FORD(i,a,b) for (int i = (a)-1; i >= (b); i--)
#define DP(arg...) fprintf(stderr, ## arg)
typedef long long ll;
typedef long double ld;
typedef pair<int,int> ii;
typedef complex<double> cpl;
int N;
int T;
struct Bod{
int x, y;
bool operator<(const Bod& b)const{
return x<b.x ||(x==b.x && y<b.y);
}
cpl cb;
};
Bod body[10100];
int obsah2(int b1, int b2, int b3){
return (body[b2].x-body[b1].x)*(body[b3].y-body[b2].y)
- (body[b2].y-body[b1].y)*(body[b3].x-body[b2].x);
}
int hdelka, ddelka;
int hbody[10100], dbody[10100];
int total[10100];
int get(int i){
return total[i%T];
}
double getX(int i, cpl unit, cpl from){
return ((body[get(i)].cb-from)/unit).real();
}
double getY(int i, cpl unit, cpl from){
return ((body[get(i)].cb-from)/unit).imag();
}
void solve() {
REP(i,N){
scanf("%d%d", &body[i].x, &body[i].y);
body[i].cb = cpl(body[i].x, body[i].y);
}
hdelka = ddelka = 0;
sort(body, body+N);
REP(i,N){
while(hdelka>=2 &&obsah2(hbody[hdelka-2], hbody[hdelka-1], i)>0)
--hdelka;
hbody[hdelka++] = i;
while(ddelka>=2 &&obsah2(dbody[ddelka-2], dbody[ddelka-1], i)<0)
--ddelka;
dbody[ddelka++] = i;
}
//mame konvex obal
for(int i=0;i<ddelka-1;++i)
total[i]=dbody[i];
for(int i=0;i<hdelka-1;++i)
total[ddelka-1+i]=hbody[hdelka-i-1];
T = hdelka+ddelka-2;
//Mame total poradi
//REP(i,T)
// printf("%d %d\n", body[total[i]].x, body[total[i]].y);
// printf("#\n");
cpl from0 = body[get(0)].cb;
cpl base0 = body[get(1)].cb-from0;
cpl unit0 = base0/abs(base0);
int Li=0, Ri=0, Ti = 0;
double Lx = getX(0, unit0, from0);
double Rx = Lx;
double Ty = getY(0, unit0, from0);
REP(i,T){
double x = getX(i, unit0, from0);
double y = getY(i, unit0, from0);
if(x < Lx)
Lx = x, Li = i;
if(x > Rx)
Rx = x, Ri = i;
if(y > Ty)
Ty = y, Ti = i;
}
double min_peri = +INFINITY;
REP(i, T){
cpl from = body[get(i)].cb;
cpl base = body[get(i+1)].cb-from;
cpl unit = base/abs(base);
Lx = getX(Li, unit, from);
Rx = getX(Ri, unit, from);
Ty = getY(Ti, unit, from);
while(getX(Li+1, unit, from)<Lx)
Lx = getX(Li+1, unit, from), ++Li;
while(getX(Ri+1, unit, from)>Rx)
Rx = getX(Ri+1, unit, from), ++Ri;
while(getY(Ti+1, unit, from)>Ty)
Ty = getY(Ti+1, unit, from), ++Ti;
//printf("u %lf %lf\n", unit.real(), unit.imag());
//printf("%lf - %lf; 0 - %lf\n", Lx, Rx, Ty);
double peri = 2*(Ty + (Rx-Lx));
if(peri<min_peri)
min_peri = peri;
}
printf("%lf\n", min_peri);
}
int main() {
while (scanf("%d",&N) != EOF) {
solve();
}
return 0;
}