代码如下:
#include<iostream>
#include<math.h>
using namespace std;
struct L
{
int x;
int y;
}qs[50001],stack[50001];
double dis(L a,L b)//求两点之间的距离
{
return sqrt((double)((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));
}
double mul(L x1,L x2,L x3)//判断是否是按照逆时针旋转
{
return (x2.x-x1.x)*(x3.y-x1.y)-(x2.y-x1.y)*(x3.x-x1.x);
}
int cmp(const void *a,const void *b)
{
L *c=(L *)a;
L *d=(L *)b;
double k=mul(qs[0],*c,*d);
if(k<0||(!k&&dis(*c,qs[0])>dis(*d,qs[0])))
return 1;
return -1;
}
void tubao(int n,int &top)//建立凸包
{
top=2;
stack[0]=qs[0];
stack[1]=qs[1];
stack[2]=qs[2];
for(int i=3;i<n;i++)
{
while(mul(stack[top-1],stack[top],qs[i])<=0&&top>=2)
top--;
top++;
stack[top]=qs[i];
}
}
int main()
{
int i,j,n,x,y,k;
while(cin>>n)
{
x=y=100000;
for(i=0;i<n;i++)
{
scanf("%d %d",&qs[i].x,&qs[i].y);
if(qs[i].x<x||qs[i].x==x&&qs[i].y<y)
{
x=qs[i].x;
y=qs[i].y;
k=i;
}
}
if(n<=2)printf("0.00\n");
else
{
L tem;
tem=qs[0];
qs[0]=qs[k];
qs[k]=tem;
int top;
qsort(qs+1,n-1,sizeof(qs[0]),cmp);
tubao(n,top);
double s=0,f,p,a,b,c;
for(i=0;i<=top-2;i++)
for(j=i+1;j<=top-1;j++)
for(k=j+1;k<=top;k++)
{
a=dis(stack[i],stack[j]);
b=dis(stack[i],stack[k]);
c=dis(stack[j],stack[k]);
p=(a+b+c)/2.0;
f=sqrt(p*(p-a)*(p-b)*(p-c));//求三角形面积
if(f>s)s=f;
}
printf("%.2lf\n",s);
}
}
}