poj 3348 cows 凸包面积

 1 /**
 2 大意: 给定多个点求其确定的面积可以存放多少个面积为50的东西
 3 思路: 1、凸包确定多边形
 4           2、 多边形求面积
 5           3、 面积/50 取整
 6 **/
 7 #include <iostream>
 8 #include <algorithm>
 9 using namespace std;
10 #define maxn 10010
11 struct point {
12     double x,y;
13     point (double x=0,double y=0):x(x),y(y){}
14 };
15 
16 point p[maxn],ch[maxn];
17 typedef point Vector;
18 
19 Vector operator -(point a,point b){
20     return Vector (a.x-b.x,a.y-b.y);
21 }
22 
23 double cross(Vector a,Vector b){
24     return a.x*b.y-a.y*b.x;
25 }
26 double polygonarea(point *p,int n){
27     double area =0;
28     for(int i=1;i<n-1;i++){
29         area += cross(p[i]-p[0],p[i+1]-p[0]);
30     }
31     return area/2;
32 }
33 bool cmp(point a,point b){
34     if(a.x==b.x)
35         return a.y<b.y;
36     return a.x<b.x;
37 }
38 
39 int convexHull(point *p,int n,point *ch){
40     sort(p,p+n,cmp);
41     int m=0;
42     for(int i=0;i<n;i++){
43         while(m>1&&cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0)
44             m--;
45         ch[m++] = p[i];
46     }
47     int k = m;
48     for(int i= n-2;i>=0;i--){
49         while(m>k&&cross(ch[m-1]-ch[m-2],p[i]-ch[m-2])<=0)
50             m--;
51         ch[m++] = p[i];
52     }
53     if(n>1) m--;
54     return m;
55 }
56 int main()
57 {
58     int n;
59     cin>>n;
60     for(int i=0;i<n;i++){
61         cin>>p[i].x>>p[i].y;
62     }
63     int res = convexHull(p,n,ch);
64     double resarea = polygonarea(ch,res);
65     cout<<(int )resarea/50<<endl;
66     return 0;
67 }

 

posted @ 2014-05-12 21:04  夜晓楼  阅读(163)  评论(0编辑  收藏  举报