hdu

    技术2026-06-22  17

    //先求凸包,枚举凸包上的点求最大三角形

    #include<iostream>

    #include<cmath>

    #include<cstdio>

    #include<algorithm>

    using namespace std;

     

    struct point

    {

    int x,y;

    }a[50001],stack[50001],flag;

    int n;

     

    int sect(point a,point b,point c)

    {

    return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y);

    }

     

    double dis(point a,point b)

    {

    return sqrt((double)((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));

    }

     

    double area(point a,point b,point c)

    {

    double x=dis(a,b),y=dis(a,c),z=dis(b,c);

    double p=(x+y+z)/2.0;

    double s=p*(p-x)*(p-y)*(p-z);

    return sqrt(s);

    }

     

    int cmp(point a,point b)

    {

    return sect(a,b,flag)>1e-8;

    }

     

    double graham()

    {

    int top=1;

    stack[0]=a[0];

    stack[1]=a[1];

    int i,j,k;

    for(i=2;i<n;i++)

    {

    while(top>0&&sect(a[i],stack[top],stack[top-1])>0)top--;

    stack[++top]=a[i];

    }

    /* printf("/n");

    for(i=0;i<=top;i++)

    printf("%d %d/n",stack[i].x,stack[i].y);

    printf("/n");

    */

    double max=0.0,s;

    for(i=0;i<top;i++)

    for(j=i+1;j<top;j++)

    for(k=j+1;k<=top;k++)

    {

    s=area(stack[i],stack[j],stack[k]);

    if(s>max)

    max=s;

    }

     

    return max;

    }

     

    int main()

    {

    while(scanf("%d",&n)!=EOF&&n!=-1)

    {

    flag.x=flag.y=100000;

    int i,j,index;

    for(i=0;i<n;i++)

    {

    scanf("%d%d",&a[i].x,&a[i].y);

    if(a[i].x<flag.x||flag.x==a[i].x&&flag.y>a[i].y)

    {

    index=i;

    flag=a[i];

    }

    }

    a[index]=a[0];

    a[0]=flag;

    sort(a+1,a+n,cmp);

    printf("%.2lf/n",graham());

    }

    return 0;

    }

     

     

     

     

     

    最新回复(0)