zoukankan      html  css  js  c++  java
  • hdu 1392 Surround the Trees

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1392

    题意:给出一些点的坐标,求最小的凸多边形把所有点包围时此多边形的周长。

    解法:凸包ConvexHull 模板题

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<cstdlib>
     6 #include<algorithm>
     7 #define inf 0x7fffffff
     8 #define PI 3.141592654
     9 #define exp 1e-10
    10 using namespace std;
    11 struct Point
    12 {
    13     double x,y;
    14     Point (double x=0,double y=0):x(x),y(y){}
    15     friend bool operator < (Point A,Point B)
    16     {
    17         if (A.x != B.x) return A.x < B.x;
    18         return A.y<B.y;
    19     }
    20 }an[111];
    21 typedef Point Vector;
    22 Vector operator + (Vector A,Vector B) {return Vector(A.x+B.x , A.y+B.y); }
    23 Vector operator - (Vector A,Vector B) {return Vector(A.x-B.x , A.y-B.y); }
    24 
    25 int dcmp(double x)
    26 {
    27     if (fabs(x)<exp) return 0;
    28     else return x<0 ? -1 : 1;
    29 }
    30 double cross(Vector A,Vector B)
    31 {
    32     return A.x*B.y-B.x*A.y;
    33 }
    34 int ConvexHull(Point *p,int n,Point *ch)
    35 {
    36     sort(p,p+n);
    37     int m=0;
    38     for (int i=0 ;i<n ;i++)
    39     {
    40         while (m>1 && dcmp(cross(ch[m-1]-ch[m-2] , p[i]-ch[m-2]))<=0) m--;
    41         ch[m++]=p[i];
    42     }
    43     int k=m;
    44     for (int i=n-2 ;i>=0 ;i--)
    45     {
    46         while (m>k && dcmp(cross(ch[m-1]-ch[m-2] , p[i]-ch[m-2]))<=0) m--;
    47         ch[m++]=p[i];
    48     }
    49     ch[m++]=ch[0];
    50     if (n>1) m--;
    51     return m;
    52 }
    53 double dis(Point a,Point b)
    54 {
    55     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    56 }
    57 int main()
    58 {
    59     int n;
    60     while (cin>>n,n)
    61     {
    62         for (int i=0 ;i<n ;i++)
    63         scanf("%lf%lf",&an[i].x,&an[i].y);
    64         if (n==1) {printf("0.00
    ");continue;}
    65         else if (n==2) {printf("%.2f
    ",dis(an[0],an[1]));continue;}
    66         Point bn[111];
    67         int m=ConvexHull(an,n,bn);
    68         double sum=0;
    69         for (int i=0 ;i<m ;i++)
    70         {
    71             sum += dis(bn[i],bn[i+1]);
    72         }
    73         printf("%.2f
    ",sum);
    74     }
    75     return 0;
    76 }
  • 相关阅读:
    Yii2 简单DateTimePicker
    Yii2简单的 yii2-phpexcel导出
    Yii2.0 是如何引入js和css
    Yii2.0 behaviors方法使用
    Yii2.0 Activeform表单部分组件使用方法
    Yii Url重新
    Yii CModel中rules验证规则
    Yii 1.0 伪静态即Yii配置Url重写(转)
    Yii main配置文件解析
    Yii框架 phpexcel 导出
  • 原文地址:https://www.cnblogs.com/huangxf/p/3691417.html
Copyright © 2011-2022 走看看