`
xxx0624
  • 浏览: 28766 次
文章分类
社区版块
存档分类
最新评论

HDU3934+凸包

 
阅读更多

题意:给定一些点,求最大三角形面积

/*
凸包
*/
#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;
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics