#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef double db; const int N = 1e5+1; const db inf = 1e9;
struct P{ db x,y,k; P(db _x=0,db _y=0,db _k=0){x=_x;y=_y;k=_k;} friend bool operator < (P a,P b){ return a.k<b.k; } friend db operator * (P a,P b){ return a.x*b.y-a.y*b.x; } friend P operator - (P a,P b){ return P(a.x-b.x,a.y-b.y); } }q[N],a[N];
int n;
bool jud(P a,P b,P t){ return (t-a)*(t-b)>0; }
db dis(P a,P b){ P t=a-b; return sqrt(t.x*t.x+t.y*t.y); }
db work(){ int R=0; for(int i=1;i<=3;++i)q[++R]=a[i]; for(int i=4;i<=n;++i){ while(R>1&&jud(q[R],q[R-1],a[i]))R--; q[++R]=a[i]; } q[R+1]=q[1]; db ret=0; for(int i=1;i<=R;++i)ret+=dis(q[i],q[i+1]); return ret; }
int main(){ scanf("%d",&n); for(int i=1;i<=n;++i)scanf("%lf%lf",&a[i].x,&a[i].y); int now=0; a[0].x=a[0].y=inf; for(int i=1;i<=n;++i)if(a[i].x<a[now].x||(a[i].x==a[now].x&&a[i].y<a[now].y))now=i; swap(a[1],a[now]); for(int i=n;i;--i)a[i].x-=a[1].x,a[i].y-=a[1].y; for(int i=1;i<=n;++i)a[i].k=atan2(a[i].y,a[i].x); sort(a+2,a+n+1); printf("%.2lf\n",work()); }
|