USACO 5.1 Fencing the Cows(凸包)

注意传参的 类型。。。模版啊。。。

 1 /*
 2 ID:cuizhe
 3 LANG: C++
 4 TASK: fc
 5 */
 6 #include <cstdio>
 7 #include <cstring>
 8 #include <cmath>
 9 #include <queue>
10 #include <iostream>
11 #include <algorithm>
12 using namespace std;
13 #define eps 1e-6
14 struct Point
15 {
16     double x,y;
17 }p[10001];
18 int s[10001];
19 double det(double x1,double y1,double x2,double y2)
20 {
21     return x1*y2 - x2*y1;
22 }
23 double cross(Point a,Point b,Point c)
24 {
25     return det(a.x-c.x,a.y-c.y,b.x-c.x,b.y-c.y);
26 }
27 double dis(Point a,Point b)
28 {
29     return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y)+eps);
30 }
31 bool cmp(Point a,Point b)
32 {
33     double t;
34     t = cross(a,b,p[0]);
35     if(t > 0||(t == 0&&dis(a,p[0]) < dis(b,p[0])))
36        return true;
37     else
38        return false;
39 }
40 int main()
41 {
42     int n,i,top;
43     Point temp;
44     double ans;
45     freopen("fc.in","r",stdin);
46     freopen("fc.out","w",stdout);
47     scanf("%d",&n);
48     for(i = 0;i < n;i ++)
49     {
50         scanf("%lf%lf",&p[i].x,&p[i].y);
51         if((p[i].y < p[0].y)||(p[i].y == p[0].y&&p[i].x < p[0].x))
52         {
53             temp = p[i];
54             p[i] = p[0];
55             p[0] = temp;
56         }
57     }
58     sort(p+1,p+n,cmp);
59     for(i = 0;i < 3;i ++)
60     {
61         s[i] = i;
62     }
63     top = 2;
64     for(i = 3;i < n;i ++)
65     {
66         while(top >= 1&&cross(p[i],p[s[top]],p[s[top-1]]) >= 0)
67         top --;
68         s[++top] = i;
69     }
70     s[top+1] = 0;
71     ans = 0;
72     for(i = 0;i <= top;i ++)
73     {
74         ans += dis(p[s[i]],p[s[i+1]]);
75     }
76     printf("%.2f\n",ans+eps);
77     return 0;
78 }

 

posted @ 2013-05-17 16:50  Naix_x  阅读(161)  评论(0编辑  收藏  举报