【凸包】HDU2202最大三角形

来源:互联网 发布:手机淘宝首页装修布局 编辑:程序博客网 时间:2024/05/18 03:04

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2202

Problem Description
老师在计算几何这门课上给Eddy布置了一道题目,题目是这样的:给定二维的平面上n个不同的点,要求在这些点里寻找三个点,使他们构成的三角形拥有的面积最大。
Eddy对这道题目百思不得其解,想不通用什么方法来解决,因此他找到了聪明的你,请你帮他解决这个题目。
 

Input
输入数据包含多组测试用例,每个测试用例的第一行包含一个整数n,表示一共有n个互不相同的点,接下来的n行每行包含2个整数xi,yi,表示平面上第i个点的x与y坐标。你可以认为:3 <= n <= 50000 而且 -10000 <= xi, yi <= 10000.
 

Output
对于每一组测试数据,请输出构成的最大的三角形的面积,结果保留两位小数。
每组输出占一行。
 

Sample Input
33 42 63 762 63 92 08 06 67 7
 

Sample Output
1.5027.00

代码:

#include<iostream>#include<cstring>#include<string>#include<cmath>#include<algorithm>#include<cstdio>#include<iomanip>using namespace std;int n;              //int top=0;          //  记录凸包中点的个数;struct node{    int x,y;}p[50005],ans[50005];//  计算两点之间的距离;double Distance(node A,node B){    return sqrt((A.x-B.x)*(A.x-B.x)*1.0+(A.y-B.y)*(A.y-B.y)*1.0);}//  判断p2的斜率比p1的斜率大还是小;int multiply(node p0,node p1,node p2){    return (p2.x-p0.x)*(p1.y-p0.y)-(p1.x-p0.x)*(p2.y-p0.y);}//  自定义排序;bool cmp(node a,node b){    int m=multiply(p[0],a,b);    if(m) return m<0;    else if(m==0) return Distance(p[0],a)>Distance(p[0],b);}void Graham(){    ans[0]=p[0];    ans[1]=p[1];    ans[2]=p[2];    top=2;    for(int i=3;i<=n;i++){        while(multiply(ans[top-1],ans[top],p[i])>0) top--;        ans[++top]=p[i];    }}double S(node a,node b,node c){    double aa=Distance(b,c);    double bb=Distance(a,c);    double cc=Distance(b,a);    double p=(aa+bb+cc)/2.0;    return sqrt(p*(p-aa)*(p-bb)*(p-cc));}int main(){    while(cin>>n){        cin>>p[0].x>>p[0].y;        node tmp=p[0];        int t=0;        for(int i=1;i<n;i++){            cin>>p[i].x>>p[i].y;            //  查找起始点,y值最小的点;            if(tmp.y>p[i].y){                t=i;                tmp=p[i];            }else if(tmp.y==p[i].y&&tmp.x>p[i].x){                t=i;                tmp=p[i];            }        }        swap(p[t],p[0]);        sort(p+1,p+n,cmp);  //  按斜率排序;        p[n]=tmp;        Graham();        double maxS=0;        for(int i=0;i<top-1;i++){            for(int j=i+1;j<=top;j++){                for(int k=j+1;k<=top;k++){                    maxS=max(maxS,S(ans[i],ans[j],ans[k]));                }            }        }        cout<<fixed<<setprecision(2)<<maxS<<endl;    }    return 0;}


0 0