• hdu 1392【Surround the Trees】


    凸包

    代码如下:
     1 #include  <cstdio>
     2 #include  <algorithm>
     3 #include <cstring>
     4 #include <cmath>
     5 using namespace std;
     6 
     7 struct node
     8 {
     9     int x,y;
    10 }p[1000],stack[1000];
    11 int n,top;
    12 
    13 double dis(node &a,node &b)
    14 {
    15     return sqrt(1.0*(a.x - b.x) * (a.x - b.x) + 1.0 * (a.y-b.y) * (a.y - b.y));
    16 }
    17 
    18 double polar(node &a,node &b,node & o)
    19 {
    20     return 1.0*(a.x - o.x) * (b.y - o.y) - 1.0*(b.x - o.x) * (a.y - o.y);
    21 }
    22 
    23 bool cmp(node& a,node& b)
    24 {
    25     double temp = polar(a,b,p[0]);
    26     
    27     if(temp == 0)
    28     {
    29         return dis(a,p[0]) < dis(b,p[0]);
    30     }
    31 
    32     return temp > 0;
    33 }
    34 
    35 void convex_hull()
    36 {
    37     stack[0] = p[0];
    38     stack[1] = p[1];
    39     top = 1;
    40     for(int i = 2;i < n;i ++)
    41     {
    42         while(top && polar(p[i],stack[top],stack[top-1]) >= 0)
    43         {
    44             top -- ;
    45         }
    46         stack[++top] = p[i];
    47     }
    48 }
    49 
    50 int main()
    51 {
    52     while(scanf("%d",&n),n)
    53     {
    54         for(int i = 0;i < n; i ++)
    55         {
    56             scanf("%d%d",&p[i].x,&p[i].y);
    57             if(i)
    58             {
    59                 if(p[i].y < p[0].y)
    60                 {
    61                     swap(p[i].y,p[0].y);
    62                     swap(p[i].x,p[0].x);
    63                 }
    64                 else if(p[i].y == p[0].y && p[i].x < p[0].x)
    65                 {
    66                     swap(p[i].x,p[0].x);
    67                 }
    68             }
    69         }
    70         if(n == 1)
    71         {
    72             printf("0.00\n");
    73             continue;
    74         }
    75         else if(n == 2)
    76         {
    77             printf("%.2lf\n",dis(p[1],p[0]));
    78             continue;
    79         }
    80 
    81         sort(p + 1,p + n,cmp);
    82         convex_hull();
    83 
    84         double sum = 0;
    85         for(int i = 1;i <= top;i ++)
    86         {
    87             sum += dis(stack[i],stack[i-1]);
    88         }
    89         sum += dis(stack[0],stack[top]);
    90         printf("%.2lf\n",sum);
    91     }
    92 
    93     return 0;
    94 }

    可以当做模板来用

  • 相关阅读:
    超全面的vue.js使用总结
    Python3 [字典】类型 学习笔记
    Python3 [集合]类型 学习笔记
    Python 希尔排序法
    Python 堆排序法
    Python 归并排序法
    Python 冒泡排序法
    Python 选择排序法
    Python 快速排序法(转)
    Python 插入排序法
  • 原文地址:https://www.cnblogs.com/Shirlies/p/2510870.html
Copyright © 2020-2023  润新知