/* 幾何 凸包 順時針!!! */ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<iostream> #include<queue> //#include<map> #include<math.h> using namespace std; typedef long long ll; //typedef __int64 int64; const int maxn = 105; const int inf = 0x7fffffff; const int pi=acos(-1.0); struct node{ int x,y; bool operator <( const node &a ) const { return y<a.y||(y==a.y&&x<a.x); } }; node pnt[ maxn ],res[ maxn ]; int cross( node sp,node ep,node op ){ return (sp.x - op.x) * (ep.y - op.y)-(ep.x - op.x) * (sp.y - op.y); } /* ep | | op----sp ( from sp to ep ) */ double dis( node a,node b ){ double sum=0; sum=1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y); return sqrt( sum ); }//兩點之間的距離 int graham( int n ){ int top=1; sort( pnt,pnt+n ); if( n==0 ) return 0; else res[ 0 ]=pnt[ 0 ]; if( n==1 ) return 1; else res[ 1 ]=pnt[ 1 ]; if( n==2 ) return 2; else res[ 2 ]=pnt[ 2 ]; for( int i=2;i<n;i++ ){ while( top&&cross( res[ top-1 ],pnt[ i ],res[ top ] )>=0 ) top--; res[ ++top ]=pnt[ i ]; } int len=top; res[ ++top ]=pnt[ n-2 ]; for( int i=n-3;i>=0;i-- ){ while( top!=len&&cross( res[ top-1 ],pnt[ i ],res[ top ] )>=0 ) top--; res[ ++top ]=pnt[ i ]; } return top;//返回res中的點的個數 } int main(){ int n; while( scanf("%d",&n)==1,n ){ for( int i=0;i<n;i++ ) scanf("%d%d",&pnt[ i ].x,&pnt[ i ].y); if( n==1 ) { printf("0.00\n"); continue; } if( n==2 ) { printf("%.2lf\n",dis( pnt[0],pnt[1] ) ); continue; }//注意這兩個情況的討論!!! int cnt=graham( n ); double ans=0; for( int i=0;i<cnt;i++ ){ if( i==cnt-1 ){ ans+=( dis( res[ cnt-1 ],res[ 0 ] ) ); } else{ ans+=( dis( res[ i ],res[ i+1 ] ) ); } } printf("%.2lf\n",ans); } return 0; }