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

    二次联通门 : HDU 1392 Surround the Trees

    /*
        HDU 1392 Surround the Trees
     
        凸包模板题
        做出凸包后
        
        从凸包上的第一个点开始
        向后扫
        计算两点间距离
        累加即可 
    */
    #include <algorithm>
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    
    #define EPS 1e-7
    
    void read (int &now)
    {
        register char word = getchar ();
        int temp = 0;
        for (now = 0; !isdigit (word); word = getchar ())
            if (word == '-')
                temp = 1;
        for (; isdigit (word); now = now * 10 + word - '0', word = getchar ());
        if (temp)
            now = -now;
    }
    
    struct Point
    {
        int x, y;
        
        Point (int __x, int __y) : x (__x), y (__y) {}
        Point () {}
    
        bool operator < (const Point &now) const
        {
            return this->x == now.x ? this->y < now.y : this->x < now.x;
        }
    };
    
    inline Point operator - (const Point &A, const Point &B)
    {
        return Point (A.x - B.x, A.y - B.y); 
    }
    
    #define Max 1000
    
    inline double Abs (double now)
    {
        return now < 0 ? -now : now;
    }
    
    inline int Cmp (double now)
    {
        if (Abs (now) <= EPS) 
            return 0;
        return now > 0 ? 1 : -1;
    }
    
    inline int Cross (const Point A, const Point B)
    {
        return A.x * B.y - A.y * B.x;
    }
    
    int Make_Honvex_Hull (Point *point, int N, Point *Stack)
    {
        std :: sort (point + 1, point + 1 + N);
        int top = 0;
        register int i;
        
        for (i = 1; i <= N; ++ i)
        {
            for (; top > 1 && Cmp (Cross (Stack[top] - Stack[top - 1], point[i] - Stack[top - 1])) == -1; -- top);
            Stack[++ top] = point[i];
        }
        int k = top;
        for (i = N - 1; i >= 1; -- i)
        {
            for (; top > k && Cmp (Cross (Stack[top] - Stack[top - 1], point[i] - Stack[top - 1])) == -1; -- top);
            Stack[++ top] = point[i];
        }
        return top;
    }
    
    
    inline double Mul_two_point_distance (const Point &A, const Point &B)
    {
        return sqrt ((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y));
    }
    
    double Mul_Polygon_length (Point *point, const int N)
    {
        double res = 0.0;
        
        for (int i = 1; i < N; i ++)
            res += Mul_two_point_distance (point[i], point[i + 1]);
    
        return res;
    }
    
    Point point[Max], List[Max];
    int main (int argc, char *argv[])
    {
        int N;
        register int i;
        for (scanf ("%d", &N); N; scanf ("%d", &N))
        {        
            for (i = 1; i <= N; i ++)
                read (point[i].x), read (point[i].y);
            
            int M = Make_Honvex_Hull (point, N, List);
            double Answer = Mul_Polygon_length (List, M);
            
            printf ("%.2lf
    ", N == 2 ? Answer / 2 : Answer);
        }
        
        return 0;
    }
  • 相关阅读:
    java实现万年历
    XCTF 逆向 re1-100
    iOS多线程开发之GCD
    Hexo Next统计文章访问量
    Name/Value 配對和物件
    Mac系统Git生成ssh公钥
    《大话数据结构》三
    C++指针和引用
    英语语法讲解第一课句子成分-表语
    String-mainipulation7
  • 原文地址:https://www.cnblogs.com/ZlycerQan/p/7326732.html
Copyright © 2011-2022 走看看