1 /**************************************************
2 Target: Andrew ——Convex Hull
3 Author: Xue Zhonghao
4 Date: 2014-04-07 12:24:54
5 **************************************************/
6 #include<cstdio>
7 #include<cstdlib>
8 #include<cmath>
9 #include<iostream>
10 using namespace std;
11
12 #define MAXN 1000
13
14 struct Point {
15 int x, y;
16 Point operator - (Point A) {
17 Point p;
18 p.x = x - A.x;
19 p.y = y - A.y;
20 return p;
21 }
22 };
23
24 Point P[MAXN];
25 Point ch[MAXN];
26
27 int cmp(const void *a, const void *b) {
28 Point p1 = *(Point *)a;
29 Point p2 = *(Point *)b;
30 if(p1.x == p2.x) return p1.y - p2.y;
31 else return p1.x - p2.x;
32 }
33
34 int Cross(Point p1, Point p2) {
35 return p1.x*p2.y - p1.y*p2.x;
36 }
37
38 int Andrew(Point* p, int N, Point* ch) {
39 qsort(p, N, sizeof(Point), cmp);
40 int m = 0;
41 for(int i = 0; i < N; ++i) {
42 while(m > 1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--;
43 ch[m++] = p[i];
44 }
45 int k = m;
46 for(int i = N-1; i >= 0; --i) {
47 while(m > k && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--;
48 ch[m++] = p[i];
49 }
50 if(N > 1) m--;
51 return m;
52 }
53
54 double cal(Point p) {
55 return sqrt(p.x*p.x + p.y*p.y);
56 }
57
58 double getlong(int n, Point* ch) {
59 double l = 0;
60 for(int i = 0; i < n; ++i)
61 l += cal(ch[i+1] - ch[i]);
62 return l;
63 }
64
65 int main(void)
66 {
67 int N, m;
68 double length;
69 cin>>N;
70 for(int i = 0; i < N; ++i) cin>>P[i].x>>P[i].y;
71 m = Andrew(P, N, ch);
72 length = getlong(m, ch);
73 cout<<length<<endl;
74 system("pause");
75 return 0;
76 }