題意:給定一些點,求最大三角形面積
/*凸包*/#include<stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>#include<iostream>#include<queue>//#include<map>#include<math.h>using namespace std;typedef long long ll;//typedef __int64 int64;const int maxn = 1000005;const int inf = 0x7fffffff;const double pi=acos(-1.0);struct node{ int x,y; bool operator <( const node & p ) const { return y<p.y||(y==p.y&&x<p.x); }};node pnt[ maxn ],res[ maxn ];int cross ( node sp,node ep,node op ){ return ( sp.x-op.x )*( ep.y-op.y )-( sp.y-op.y )*( ep.x-op.x );}int dis2( node a,node b ){ return ( a.x-b.x )*( a.x-b.x )+( a.y-b.y )*( a.y-b.y );}int garham( int n ){ int top=1; sort( pnt,pnt+n ); if( n==0 ) return 0; else res[ 0 ]=pnt[ 0 ]; if( n==1 ) return 1; else res[ 1 ]=pnt[ 1 ]; if( n==2 ) return 2; else res[ 2 ]=pnt[ 2 ]; for( int i=2;i<n;i++ ){ while( top>0&&cross( res[ top-1 ],pnt[ i ],res[ top ] )>=0 ) top--; res[ ++top ]=pnt[ i ]; } int len=top; res[ ++top ]=pnt[ n-2 ]; for( int i=n-3;i>=0;i-- ){ while( top!=len&&cross( res[ top-1 ],pnt[ i ],res[ top ] )>=0 ) top--; res[ ++top ]=pnt[ i ]; } return top;}int main(){ int n; while( scanf("%d",&n)!=EOF ){ for( int i=0;i<n;i++ ) scanf("%d%d",&pnt[ i ].x,&pnt[ i ].y); int cnt=garham( n ); double ans=0; for( int i=0;i<cnt;i++ ){ for( int j=i+1;j<cnt;j++ ){ for( int k=j+1;k<cnt;k++ ){ ans=max( ans,( 0.5*cross( res[ j ],res[ k ],res[ i ] ) ) ); } } } printf("%.2lf\n",ans); } return 0;}