Cows POJ - 3348

Cows

 POJ - 3348 

 题意:给你一些树的坐标,让你来建筑面积最大的牛场,问能养多少头牛,一个牛的面积50

思路:求凸包面积即可,先求出凸包,然后再求ch[]里面的凸包顶点集所围成的多边形的面积即可

 1 // 
 2 // Created by HJYL on 2020/2/3.
 3 //
 4 #include<iostream>
 5 #include<cstring>
 6 #include<cstdio>
 7 #include<cmath>
 8 #include<algorithm>
 9 using namespace std;
10 const double eps=1e-8;
11 const int maxn=1e5+10;
12 const int INF=0x3ffff;
13 struct Point{
14     double x,y;
15     Point(double x=0,double y=0):x(x),y(y){}
16     Point operator - (Point const &b)const
17     {
18         return Point(x-b.x ,y-b.y);
19     }
20     bool operator < (Point const &c)const{
21         if(x==c.x)
22             return y<c.y;
23         return x<c.x;
24     }
25 }p[maxn],ch[maxn];
26 int n,m;
27 double Cross(Point A,Point B)
28 {
29     return (A.x*B.y)-(A.y*B.x);
30 }
31 double PolygonArea(Point* p, int n){//p为端点集合,n为端点个数
32     double s = 0;
33     for(int i = 1; i < n-1; ++i)
34         s += Cross(p[i]-p[0], p[i+1]-p[0]);
35     return s;
36 }
37 void ConvexHull() ///**求凸包*/
38 {
39     sort(p,p+n);//n顶点数
40     m = 0;
41     for(int i = 0; i < n; i++)
42     {
43         while(m > 1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--;
44         ch[m++] = p[i];
45     }
46     int k = m;
47     for(int i = n-2; i >= 0; i--)
48     {
49         while(m > k && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--;
50         ch[m++] = p[i];
51     }
52     if(n > 1) m--;
53 }
54 int main()
55 {
56     while(~scanf("%d",&n))
57     {
58         for(int i=0;i<n;i++)
59             scanf("%lf%lf",&p[i].x,&p[i].y);
60         ConvexHull();
61         double ss=PolygonArea(ch,m)/2.0;
62         int num=ss/50.0;
63         printf("%d\n",num);
64     }
65     return 0;
66 }

 

posted @ 2020-02-03 17:18  branna  阅读(118)  评论(0编辑  收藏  举报