zoukankan      html  css  js  c++  java
  • HDU2202 凸包

    凸包算法+枚举

    View Code
     1  /*
     2  凸包
     3  顺时针!!!!
     4  */
     5  #include<stdio.h>
     6  #include<string.h>
     7  #include<stdlib.h>
     8  #include<algorithm>
     9  #include<iostream>
    10  #include<queue>
    11  #include<stack>
    12  #include<math.h>
    13  #include<map>
    14  using namespace std;
    15  const int maxn = 50005;
    16  struct node{
    17      int x,y;
    18  };
    19  bool operator < ( const node &l,const node &r ){
    20          return l.y<r.y||( l.y==r.y&&l.x<r.x );
    21  }
    22  node pnt[ maxn ],res[ maxn ];
    23 int mult( node sp,node ep,node op ){
    24      return (sp.x - op.x) * (ep.y - op.y)-(ep.x - op.x) * (sp.y - op.y);
    25  }
    26  /*
    27  ep
    28  |
    29  |
    30  op----sp
    31  ( from sp to ep )
    32  */
    33  int graham( int n ){
    34      int i, len, k = 0;
    35      int top = 1;
    36      sort(pnt, pnt + n);
    37      if (n == 0) return 0; res[0] = pnt[0];
    38      if (n == 1) return 1; res[1] = pnt[1];
    39      if (n == 2) return 2; res[2] = pnt[2];
    40      for (i = 2; i < n; i++) {
    41          while (top && mult(res[ top ], pnt[ i ], res[top-1])>=0 )//( cross : from top to i )
    42              top--;
    43          res[++top] = pnt[i];
    44      }
    45      len = top; res[++top] = pnt[n - 2];
    46      for (i = n - 3; i >= 0; i--) {
    47          while (top!=len && mult(res[ top ], pnt[ i ], res[top-1])>=0 ) 
    48          top--;
    49          res[++top] = pnt[i];
    50      }
    51      return top; // 返回凸包中点的个数
    52  }
    53  int main(){
    54      int n;
    55      while( scanf("%d",&n)!=EOF ){
    56          for( int i=0;i<n;i++ )
    57              scanf("%d%d",&pnt[i].x,&pnt[i].y);
    58          int cnt=graham( n );
    59          double ans=0;
    60          for( int i=0;i<cnt;i++ ){
    61              for( int j=i+1;j<cnt;j++ ){
    62                  for( int k=j+1;k<cnt;k++ ){
    63                      double tmp=mult( res[i],res[k],res[j] );
    64                      ans=max( ans,tmp );
    65                  }
    66              }
    67          }
    68          ans*=0.5;
    69          printf("%.2lf\n",ans);
    70      }
    71      return 0;
    72  }
    keep moving...
  • 相关阅读:
    1204整理
    JDBC(与Orcale的连接)(转)
    Listener监听器详解(转)
    Filter过滤器详解(转)
    第十二章 存货
    会计基础 第一章 总论 部分复习题目
    会计基础 第一章 总论
    星座备考之狮子座如何复习会计从业资格考试
    会计基础第八章内容2
    何以解养老之忧
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2952637.html
Copyright © 2011-2022 走看看