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

HDU1392+凸包

 
阅读更多
/*
 几何 凸包
 顺时针!!!
 */
 #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 = 105;
 const int inf = 0x7fffffff;
 const int pi=acos(-1.0);
 struct node{
     int x,y;
     bool operator <( const node &a ) const {
         return y<a.y||(y==a.y&&x<a.x);
     }
 };

 node pnt[ maxn ],res[ maxn ];
 
 int cross( node sp,node ep,node op ){
     return (sp.x - op.x) * (ep.y - op.y)-(ep.x - op.x) * (sp.y - op.y);
 }
 /*
 ep
 |
 |
 op----sp
 ( from sp to ep )
 */
 
 double dis( node a,node b ){
     double sum=0;
     sum=1.0*(a.x-b.x)*(a.x-b.x)+1.0*(a.y-b.y)*(a.y-b.y);
     return sqrt( sum );
 }//两点之间的距离
 
 int graham( 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&&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;//返回res中的点的个数
 }
     
 int main(){
     int n;
     while( scanf("%d",&n)==1,n ){
         for( int i=0;i<n;i++ )
             scanf("%d%d",&pnt[ i ].x,&pnt[ i ].y);
         if( n==1 )
         {
             printf("0.00\n");
             continue;
         }
         if( n==2 )
         {
             printf("%.2lf\n",dis( pnt[0],pnt[1] ) );
             continue;
         }//注意这两个情况的讨论!!!
         int cnt=graham( n );
         double ans=0;
         for( int i=0;i<cnt;i++ ){
             if( i==cnt-1 ){
                 ans+=( dis( res[ cnt-1 ],res[ 0 ] ) );
             }
             else{
                 ans+=( dis( res[ i ],res[ i+1 ] ) );
             }
         }
         printf("%.2lf\n",ans);
     }
     return 0;
 }


分享到:
评论

相关推荐

    hdu1392 代码

    凸包经典入门,求凸包周长.00000000000000000000000

    HDU-2000-2099.rar_hdu

    6. **数学与计算几何**:2201-2250号题目可能涵盖组合数学、数论、几何算法,如凸包、最近点对等。 7. **贪心算法**:贪心策略通常用于每一步都做出局部最优决策,以达到全局最优。2251-2300号题目可能需要使用贪心...

    hdu题目分类

    ### hdu题目分类知识点概述 本篇将对“hdu题目分类”中提及的各种类型问题进行详细介绍,旨在帮助读者更好地理解这些题目所涉及的核心概念和技术点,并为编程竞赛中的实战训练提供参考。以下是对每道题目的具体分析...

    HDU——ACM.zip

    【HDU——ACM.zip】压缩包文件是一个专门为准备ACM(国际大学生程序设计竞赛)集训而设计的资源集合,包含了多个关键算法领域的详细讲解。这个资源包旨在帮助参赛者提升算法理解与编程能力,涵盖了多项在算法竞赛中...

    hdu acm教案4

    理解和掌握这些属性对于后续的计算几何问题,如求凸包等,都具有基础性作用。 **第二单元:多边形面积和重心** 在这一单元,重点讲解了如何计算简单多边形的面积和重心。简单多边形指的是不自相交的多边形。给定一...

    ACM-ICOC培训资料汇编(7)计算几何

    - **凸包定义**:对于平面上的一组点,其凸包是指包含这组点的所有凸多边形中边界最小的一个。 - **构建过程**:寻找一组点中最左下角的点作为起点,然后按逆时针方向构建边界。 ##### 2.2 求凸包的几种算法 - **...

    计算几何 算法几何 程序

    压缩包中的"HDUACM2010版_07)计算几何基础.ppt"很可能是一个讲座或教程的幻灯片,可能涵盖了计算几何的基本概念、核心算法以及一些经典问题的解决方案。对于初学者,这是一个很好的起点,可以深入理解计算几何的...

    HD-ACM全套讲义

    5. **计算几何**:点线面的关系、凸包、最近点对等问题,常常在图形相关的题目中出现。 6. **位操作**:在某些优化算法中,位操作可以提高效率,如快速幂、位运算求异或等。 讲义中可能还会包含以下内容: 7. **...

    kuangbin的ACM模板

    平面最近点对(HDU1007) - **问题描述**:给定平面上的一组点,找到距离最近的两点。 - **算法思想**:通过分治法实现,将点集分为左右两部分,分别求出左右两侧的最近点对,然后再寻找跨越这两部分的最近点对。 -...

    kuangbin acm模板超级好用

    2.18.1 HDU4656 卷积取模 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.19 其它公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 2.19.1 Polya . . . ....

    杭电ACM 课件

    常见问题包括直线与直线、圆的交点计算,多边形的面积、凸包问题等。掌握向量运算、极坐标的使用,以及了解平面几何的基本定理,对解决计算几何问题至关重要。 三、贪心算法 贪心算法是一种局部最优解策略,每次...

    HDOJ.rar_HD_HDOJ

    【标题】"HDOJ.rar_HD_HDOJ" 是一个与HDU(杭州电子科技大学)在线判题系统HDOJ相关的压缩包文件,其中包含了大量编程题目的源代码。 【描述】提到,这个压缩包包含了几百道HDOJ题目的源代码,这意味着它是一个宝贵...

    杭电ACM分类杭电ACM分类

    【杭电ACM分类】是针对杭州电子科技大学(HDU)在线判题系统(OJ)中的编程竞赛题目进行的一种整理和归类方式。这些竞赛题目通常涉及算法设计、数据结构、数学应用等多个方面,旨在提升参赛者的编程思维和解决实际...

Global site tag (gtag.js) - Google Analytics