1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; const int N = 1e5+10; const double eps = 1e-8; int n,top; double ans; struct point { double x,y; point(){} point(double a,double b){x = a, y = b;} }p[N],sta[N]; point operator + (point a,point b){return point(a.x+b.x,a.y+b.y);} point operator - (point a,point b){return point(a.x-b.x,a.y-b.y);} point operator * (point a,double k){return point(a.x*k,a.y*k);} double Dot(point a,point b){return a.x*b.x+a.y*b.y;} double Cro(point a,point b){return a.x*b.y-a.y*b.x;} double dis(point a,point b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } int dcmp(double x) { if(fabs(x) < eps) return 0; return x > 0 ? 1 : -1; } bool comp(point a,point b) { if(dcmp(a.x-b.x) == 0) return a.y < b.y; return a.x < b.x; } int main() { scanf("%d",&n); for(int i = 1; i <= n; i++) scanf("%lf%lf",&p[i].x,&p[i].y); sort(p+1,p+n+1,comp); sta[++top] = p[1]; sta[++top] = p[2]; for(int i = 3; i <= n; i++) { while(top >= 2 && Cro(sta[top]-sta[top-1],p[i]-sta[top-1]) < 0) top--; sta[++top] = p[i]; } int last = top; sta[++top] = p[n]; sta[++top] = p[n-1]; for(int i = n-2; i >= 1; i--) { while(top - last >= 2 && Cro(sta[top]-sta[top-1],p[i]-sta[top-1]) < 0) top--; sta[++top] = p[i]; } for(int i = 1; i < top; i++) ans += dis(sta[i],sta[i+1]); printf("%.2lf\n",ans); return 0; }
|