[POJ3348]Cows(凸包)

来源:互联网 发布:淘宝上电动涡轮增压器 编辑:程序博客网 时间:2024/06/06 05:00

题目描述

传送门
题意:给你n棵树,可以用这n棵树围一个圈,然后在圈里面可以养牛,每个牛需要50平方米的空间,问最多可以养多少牛?

题解

求凸包的面积,/50就可以了

代码

#include<algorithm>#include<iostream>#include<cstring>#include<cstdio>#include<cmath>using namespace std;#define N 10005const double eps=1e-9;int dcmp(double x){    if (x<=eps&&x>=-eps) return 0;    return (x>0)?1:-1;}struct Vector{    double x,y;    Vector(double X=0,double Y=0)    {        x=X,y=Y;    }    bool operator < (const Vector &a) const    {        return x<a.x||(x==a.x&&y<a.y);    }};typedef Vector Point;Vector operator - (Vector A,Vector B) {return Vector(A.x-B.x,A.y-B.y);}int n,top;double x,y,ans;Point p[N],stack[N];double Cross(Vector A,Vector B){    return A.x*B.y-A.y*B.x;}void Graham(){    sort(p+1,p+n+1);    for (int i=1;i<=n;++i)    {        while (top>1&&dcmp(Cross(stack[top]-stack[top-1],p[i]-stack[top-1]))<=0)            --top;        stack[++top]=p[i];    }    int k=top;    for (int i=n-1;i>=1;--i)    {        while (top>k&&dcmp(Cross(stack[top]-stack[top-1],p[i]-stack[top-1]))<=0)            --top;        stack[++top]=p[i];    }    if (n>1) --top;}double Area(){    double area=0;    for (int i=2;i<top;++i)        area+=Cross(stack[i]-stack[1],stack[i+1]-stack[1]);    return area/2.0;}int main(){    scanf("%d",&n);    for (int i=1;i<=n;++i)    {        scanf("%lf%lf",&x,&y);        p[i]=Point(x,y);    }    Graham();    ans=Area();    printf("%d\n",(int)ans/50);}
0 0
原创粉丝点击