• poj 1113 Wall


    凸包周长+圆周长

    View Code
     1 /*
     2 Coder:Zhaofa Fang
     3 Lang:C++
     4 */
     5 #include <cstdio>
     6 #include <cstdlib>
     7 #include <iostream>
     8 #include <cmath>
     9 #include <cstring>
    10 #include <algorithm>
    11 #include <string>
    12 #include <vector>
    13 #include <queue>
    14 #include <stack>
    15 #include <map>
    16 #include <set>
    17 #define pb push_back
    18 using namespace std;
    19 
    20 //==========================================
    21 const double PI=acos(-1);
    22 
    23 struct Point
    24 {
    25     double x,y;
    26 }point[1005],res[1005];
    27 
    28 double det(double x1,double y1,double x2,double y2)
    29 {
    30     return x1*y2-x2*y1;
    31 }
    32 double xmult(Point o,Point a ,Point b)
    33 {
    34     return det(a.x-o.x,a.y-o.y,b.x-o.x,b.y-o.y);
    35 }
    36 double dis(Point a,Point b)
    37 {
    38     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    39 }
    40 bool cmp(const Point &x,const Point &y)
    41 {
    42     if(xmult(point[0],x,y)==0)
    43         return dis(point[0],x)<dis(point[0],y);
    44     return xmult(point[0],x,y)>0;
    45 }
    46 double Graham(int n)
    47 {
    48     Point tmp;
    49     int k=0,top=2;
    50     for(int i=1;i<n;i++)
    51     {
    52         if(point[i].y<point[k].y || point[i].y==point[k].y && point[i].x<point[k].x)
    53         k=i;
    54     }
    55     tmp=point[0],point[0]=point[k],point[k]=tmp;
    56     sort(point+1,point+n,cmp);
    57     res[0]=point[0],res[1]=point[1],res[2]=point[2];
    58     for(int i=3;i<n;i++)
    59     {
    60         while(top && xmult(res[top-1],res[top],point[i])<=0)top--;
    61         res[++top]=point[i];
    62     }
    63     double sum=0;
    64     for(int i=1;i<top+1;i++)
    65     {
    66         sum += dis(res[i],res[i-1]);
    67     }
    68     sum += dis(res[top],res[0]);
    69     return sum;
    70 }
    71 int main()
    72 {
    73     int n;
    74     double L;
    75     while(~scanf("%d%lf",&n,&L))
    76     {
    77         for(int i=0;i<n;i++)
    78         {
    79             scanf("%lf%lf",&point[i].x,&point[i].y);
    80         }
    81         double sum=Graham(n);
    82         sum+=2*PI*L;
    83         printf("%.0f\n",sum);
    84     }
    85     return 0;
    86 }

      

  • 相关阅读:
    特性类
    WebGL中的第三个小程序(着色器)
    C#紧耦合的例子
    特性
    python两个目录匹配,粘贴图片
    Leetcode 53
    逻辑回归-1.原理
    多项式回归-4.模型正则化
    python 线程
    python 进程
  • 原文地址:https://www.cnblogs.com/fzf123/p/2625680.html
Copyright © 2020-2023  润新知