hdu_1392

  1 #include<iostream>
  2 #include<stdlib.h>
  3 #include<cmath>
  4 #include<stdio.h>
  5 using namespace std;
  6 int n;
  7 typedef struct
  8 {
  9     double x;
 10     double y;
 11 }Point;
 12 
 13 Point p[110],s[110];
 14 
 15 int top;
 16 
 17 double Mul(Point a, Point b, Point c)
 18 {
 19     return (b.x - a.x)*(c.y - a.y) - (b.y - a.y)*(c.x - a.x);
 20 }
 21 
 22 double dis(Point a, Point b)
 23 {
 24     return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
 25 }
 26 
 27 
 28 int cmp(const void *a, const void *b)                
 29 {
 30     Point c = *(Point *)a;
 31     Point d = *(Point *)b;
 32     double k = Mul(p[0], c, d);
 33     if(k < 0 || (!k && dis(c, p[0]) > dis(d, p[0]))) 
 34         return 1;
 35     return -1;
 36 } 
 37 
 38 
 39 void Con()
 40 {
 41     int i;
 42     for(i = 1; i < n; i++)
 43     {
 44         Point temp;
 45         if(p[i].y < p[0].y || (p[i].y == p[0].y && p[i].x < p[0].x))
 46         {
 47             temp = p[i];
 48             p[i] = p[0];
 49             p[0] = temp;
 50         }
 51     }
 52     qsort(p+1, n - 1, sizeof(p[0]), cmp);
 53     s[0] = p[0];        
 54     s[1] = p[1];
 55     s[2] = p[2];
 56     top =2;
 57     
 58     for(i = 3; i < n; i++)//congsan
 59     {
 60         while(top >= 2 && Mul(s[top - 1], s[top], p[i]) <= 0) 
 61             top--;
 62         top++;
 63         s[top] = p[i];
 64     }
 65 }
 66 
 67 
 68 int main()
 69 {
 70     
 71     while(cin>>n,n)
 72     {
 73         int i;
 74         for(i = 0; i < n; i++)
 75         {
 76             cin>>p[i].x>>p[i].y;
 77         }
 78         if(n == 1)
 79         {
 80             cout<<"0.00"<<endl;
 81             continue;
 82         }
 83     
 84         else if(n == 2)
 85         {
 86             printf("%.2lf\n",dis(p[0],p[1]));
 87             continue;
 88         }
 89         Con();
 90         double count = 0;
 91         for(i = 0; i < top; i++)
 92         {
 93             count += dis(s[i],s[i+1]);
 94         }
 95         count += dis(s[top],s[0]);
 96         printf("%.2lf\n",count);
 97 
 98     }
 99     return 0;
100 }
原文地址:https://www.cnblogs.com/konkon/p/2461271.html