HDU 3934 凸包
题意:给定一些点,求最大三角形面积
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 凸包+最大三角形面积 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #include<algorithm> 8 #include<iostream> 9 #include<queue> 10 //#include<map> 11 #include<math.h> 12 using namespace std; 13 typedef long long ll; 14 //typedef __int64 int64; 15 const int maxn = 1000005; 16 const int inf = 0x7fffffff; 17 const double pi=acos(-1.0); 18 struct node{ 19 int x,y; 20 bool operator <( const node & p ) const { 21 return y<p.y||(y==p.y&&x<p.x); 22 } 23 }; 24 node pnt[ maxn ],res[ maxn ]; 25 26 int cross ( node sp,node ep,node op ){ 27 return ( sp.x-op.x )*( ep.y-op.y )-( sp.y-op.y )*( ep.x-op.x ); 28 } 29 30 int dis2( node a,node b ){ 31 return ( a.x-b.x )*( a.x-b.x )+( a.y-b.y )*( a.y-b.y ); 32 } 33 34 int garham( int n ){ 35 int top=1; 36 sort( pnt,pnt+n ); 37 if( n==0 ) return 0; 38 else res[ 0 ]=pnt[ 0 ]; 39 if( n==1 ) return 1; 40 else res[ 1 ]=pnt[ 1 ]; 41 if( n==2 ) return 2; 42 else res[ 2 ]=pnt[ 2 ]; 43 44 for( int i=2;i<n;i++ ){ 45 while( top>0&&cross( res[ top-1 ],pnt[ i ],res[ top ] )>=0 ) 46 top--; 47 res[ ++top ]=pnt[ i ]; 48 } 49 50 int len=top; 51 res[ ++top ]=pnt[ n-2 ]; 52 for( int i=n-3;i>=0;i-- ){ 53 while( top!=len&&cross( res[ top-1 ],pnt[ i ],res[ top ] )>=0 ) 54 top--; 55 res[ ++top ]=pnt[ i ]; 56 } 57 58 return top; 59 } 60 61 int main(){ 62 int n; 63 while( scanf("%d",&n)!=EOF ){ 64 for( int i=0;i<n;i++ ) 65 scanf("%d%d",&pnt[ i ].x,&pnt[ i ].y); 66 int cnt=garham( n ); 67 double ans=0; 68 for( int i=0;i<cnt;i++ ){ 69 for( int j=i+1;j<cnt;j++ ){ 70 for( int k=j+1;k<cnt;k++ ){ 71 ans=max( ans,( 0.5*cross( res[ j ],res[ k ],res[ i ] ) ) ); 72 } 73 } 74 } 75 printf("%.2lf\n",ans); 76 } 77 return 0; 78 }
keep moving...