zoukankan      html  css  js  c++  java
  • poj 1113 Wall

    题目链接:http://poj.org/problem?id=1113

    题目大意:给出点集和一个长度L,要求用最短长度的围墙把所有点集围住,并且围墙每一处距离所有点的距离最少为L,求围墙的长度。

    解法:凸包+以L为半径的圆的周长。以题目中的图为例,两点之间的围墙长度之和正好就是凸包的长度,再加上每个点的拐角处(注意此处为弧,才能保证城墙距离点的距离最短)的长度。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstdlib>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<algorithm>
     7 #define inf 0x7fffffff
     8 #define exp 1e-10
     9 #define PI 3.141592654
    10 using namespace std;
    11 int n,L;
    12 struct Point
    13 {
    14     double x,y;
    15     Point (double x=0,double y=0):x(x),y(y){}
    16     friend bool operator < (Point a,Point b)
    17     {
    18         if (a.x!=b.x) return a.x<b.x;
    19         return a.y<b.y;
    20     }
    21 }an[1000+10],bn[1000+10];
    22 typedef Point Vector;
    23 Vector operator + (Vector A,Vector B) {return Vector(A.x+B.x , A.y+B.y); }
    24 Vector operator - (Vector A,Vector B) {return Vector(A.x-B.x , A.y-B.y); }
    25 Vector operator * (Vector A,double p) {return Vector(A.x*p , A.y*p); }
    26 int dcmp(double x)
    27 {
    28     if (fabs(x)<exp) return 0;
    29     else return x<0 ? -1 : 1;
    30 }
    31 double cross(Vector A,Vector B)
    32 {
    33     return A.x*B.y-B.x*A.y;
    34 }
    35 int ConvexHull(Point *p,int n,Point *ch)
    36 {
    37     sort(p,p+n);
    38     int m=0;
    39     for (int i=0 ;i<n ;i++)
    40     {
    41         while (m>1 && dcmp(cross(ch[m-1]-ch[m-2],p[i]-ch[m-1]))<=0) m--;
    42         ch[m++]=p[i];
    43     }
    44     int k=m;
    45     for (int i=n-2 ;i>=0 ;i--)
    46     {
    47         while (k>m && dcmp(cross(ch[k-1]-ch[k-2],p[i]-ch[k-1]))<=0) k--;
    48         ch[k++]=p[i];
    49     }
    50     ch[k++]=ch[0];
    51     if (n>1) k--;
    52     return k;
    53 }
    54 int main()
    55 {
    56     while (cin>>n>>L)
    57     {
    58         for (int i=0 ;i<n ;i++)
    59         scanf("%lf%lf",&an[i].x,&an[i].y);
    60 
    61         int k=ConvexHull(an,n,bn);
    62         double sum=0;
    63         sum += 2*PI*L;
    64         for (int i=0 ;i<k ;i++)
    65         {
    66             sum += sqrt((bn[i].x-bn[i+1].x)*(bn[i].x-bn[i+1].x)+(bn[i].y-bn[i+1].y)*(bn[i].y-bn[i+1].y));
    67         }
    68         printf("%.0f
    ",sum);
    69     }
    70     return 0;
    71 }
  • 相关阅读:
    仿网易/QQ空间视频列表滚动连播炫酷效果
    UIScrollerView当前显示3张图
    iOS AVPlayer视频播放器
    iOS 购物车动画
    C++从零实现简单深度神经网络(基于OpenCV)
    Android 轻松实现仿淘宝地区选择
    微信小程序之下拉刷新,上拉更多列表实现
    iOS 指南针
    tableView 获取网络图片,并且设置为圆角(优化,fps)
    黑客技术 —— Linux 命令行
  • 原文地址:https://www.cnblogs.com/huangxf/p/3704353.html
Copyright © 2011-2022 走看看