POJ 2079 Triangle(凸包+旋转卡壳,求最大三角形面积)

来源:互联网 发布:vm安装mac os 编辑:程序博客网 时间:2024/06/04 23:32

POJ 2079 Triangle(凸包+旋转卡壳,求最大三角形面积)

题目链接:http://poj.org/problem?id=2079

题意

     给出n个点,求有三个点组成的三角形中,最大的面积。

分析:

先求凸包,早用旋转卡壳求差积的绝对值最大值,三角形的面积等于差积的绝对值的一半。

#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<iostream>using namespace std;const double eps=1e-10;int dcmp(double x){    if(fabs(x)<eps) return 0;    return x<0?-1:1;}struct Point{    double x,y;    Point(){}    Point(double x,double y):x(x),y(y){}    bool operator<(const Point &B)const    {        return dcmp(x-B.x)<0 || (dcmp(x-B.x)==0 && dcmp(y-B.y)<0 );    }    bool operator==(const Point &B)const    {        return dcmp(x-B.x)==0 && dcmp(y-B.y)==0;    }};typedef Point Vector;Vector operator-(Point A,Point B){    return Vector(A.x-B.x,A.y-B.y);}Vector operator+(Vector A,Vector B){    return Vector(A.x+B.x,A.y+B.y);}double Cross(Vector A,Vector B)//向量差积{    return A.x*B.y-A.y*B.x;}Vector Rotate(Vector A,double rad){    return Vector(A.x*cos(rad)-A.y*sin(rad), A.x*sin(rad)+A.y*cos(rad));}int ConvexHull(Point *p,int n,Point *ch)//求凸包{    sort(p,p+n);    n=unique(p,p+n)-p;//去重    int m=0;    for(int i=0;i<n;++i)    {        while(m>1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2])<=0 ) --m;        ch[m++]=p[i];    }    int k=m;    for(int i=n-2;i>=0;i--)    {        while(m>k && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2])<=0) --m;        ch[m++]=p[i];    }    if(n>1) m--;    return m;}double dist2(Point a,Point b){return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);}/***以上为刘汝佳模板***/const int maxn=50000+5;Point P[maxn];Point p[maxn];//旋转卡壳,求两点间距离平方的最大值double rotating_calipers(Point p[],int n){    double ans = 0;    Point v;    int cur = 1;    for(int i = 0;i < n;i++)    {        int j = (i+1)%n;        int k = (j+1)%n;        while(j != i && k != i)        {        //abs((p[j]-p[i])^(p[k]-p[i])) 是由i,j,k三点组成的三角形的面积            ans = max(ans,abs( Cross(p[j]-p[i],p[k]-p[i]) ) );            while( ( Cross(p[i]-p[j],p[(k+1)%n]-p[k]) ) < 0 )                k = (k+1)%n;            j = (j+1)%n;        }    }    return ans;}int main(){    int n;    while(scanf("%d",&n) == 1)    {    if(n==-1)break;        for(int i = 0;i < n;i++)            scanf("%lf%lf",&p[i].x,&p[i].y);        int m=ConvexHull(p,n,P);printf("%.2lf\n",rotating_calipers(P,m)/2);    }    return 0;}


阅读全文
0 0
原创粉丝点击