zoukankan      html  css  js  c++  java
  • codeforces 1C. Ancient Berland Circus

    二次联通门 : codeforces 1C. Ancient Berland Circus

    /*
        c题 
        封装起来就WA
        拿出来就A了
        无奈 
        
        以一个场地遗迹,呈现多边形,但是不知道具体是几边形,
        只知道他的三个点,求能包含这三个点的最小正多边形的面积:
        
        分别求出三个点之间的距离
        
        先求出他的外接圆,得到外接圆的半径r
        有给定的坐标求出三条边的边长,s_1,s_2,s_3;
        又海伦公式得到三角形的面积: 周长p = (s_1+s_2+s_3)/2.0
        面积等于: S=sqrt(p*(p-s_1)*(p-s_2)*(p-s_3));
        r=s_1*s_2*s_3/(4*S)
        
        得到外接园的半径之后:
       我们再来求出每一条边对应的圆心角a,b,c;
       求出a,b,c圆心角的最大公约数p;
       
        这样我们就可以知道他是边数: 2*pi/p;
        所以得到最小单位的三角形的面积为Area=r*r*sin(p)/2;
        总面积只需再剩上他的边数就可以得到
    */
    #include <cstdio>
    #include <cmath>
    #define Max 5
    #define EPS 0.01
    
    #define PI 3.14159265358
    
    /*
    class Point_Type
    {
        private :
            
            struct Point_Date
            {
                double x;
                double y;
            }
            point[Max];
        
            struct Line_Date
            {
                double k;
                double b;
            }line[Max];
            
            double Get_Gcd (double a, double b)
            {
                return a < EPS ? b : Get_Gcd (fmod (b, a), a);
            }
            
            double Get_k (Point_Date a, Point_Date b)
            {
                return (a.y - b.y) / (a.x - b.x);
            }
            
            double Get_Range (Point_Date a, Point_Date b)
            {
                return sqrt ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
            }
            
            Point_Date Get_Mid_Point_Pos (Point_Date a, Point_Date b)
            {
                Point_Date now;
                now.x = (a.x + b.x) / 2.0;
                now.y = (a.y + b.y) / 2.0; 
            }
            
            void swap (double &a, double &b)
            {
                double now;
                a = b;
                b = now;
            }
            
        public :
            
            void Insert_Date ()
            {
                for (int i = 1; i <= 3; i++)
                {
                    scanf ("%lf", &point[i].x);
                    scanf ("%lf", &point[i].y);
                }
            }
            
            void Get_3_line ()
            {
                Point_Date now;
                for (int i = 1; i <= 2; i++)
                {
                    now = Get_Mid_Point_Pos (point[i], point[i + 1]);
                    line[i].k = -1.0 / Get_k (point[i], point[i + 1]);
                    line[i].b = (now.y - line[i].k * now.x);
                }
                now = Get_Mid_Point_Pos (point[3], point[1]);
                line[3].k = -1.0 / Get_k (point[3], point[1]);
                line[3].b = (now.y - line[3].k * now.x);
            }
            
            void MMP ()
            {
    //            Get_3_line ();
            }
    };
    
    Point_Type Make;
    */
    
    struct Point_Date
    {
        double x;
        double y;
    }
    point[Max];
    
    double Get_Range (Point_Date a, Point_Date b)
    {
        return sqrt ((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
    }
        
    bool swap (double &a, double &b)
    {
        double now = a;
        a = b;
        b = now;
    }
    
    double Get_Gcd (double a, double b)
    {
        return a < EPS ? b : Get_Gcd (fmod (b, a), a);
    }
            
    int main (int argc, char *argv[])
    {
        for (int i = 1; i <= 3; i++)
        {
            scanf ("%lf", &point[i].x);
            scanf ("%lf", &point[i].y);
        }
        
        double s_1, s_2, s_3;
        s_1 = Get_Range (point[1], point[2]);
        s_2 = Get_Range (point[2], point[3]);
        s_3 = Get_Range (point[3], point[1]);
        double p = (s_1 + s_2 + s_3) / 2.0;
        double S = sqrt (p * (p - s_1) * (p - s_2) * (p - s_3));
        double r = (s_1 * s_2 * s_3) / (4.0 * S);
        
        if (s_1 > s_3)
            swap (s_1, s_3);
        if (s_2 > s_3)
            swap (s_2, s_3);
            
        double G_1 = 2.0 * asin (s_1 / (2.0 * r));
        double G_2 = 2.0 * asin (s_2 / (2.0 * r));
        double G_3 = 2.0 * PI - G_1 - G_2;
        
        p = Get_Gcd (G_1, G_2);
        p = Get_Gcd (p, G_3);
        printf ("%.6lf", (PI * r * r * sin (p)) / p);
        
        return 0;
    }
  • 相关阅读:
    音频文件的属性
    判断UITextField.text是否为空(转)
    digital audio properties
    对scrollView的属性contentSize contentOffset contentInset个人理解
    OC定义变参函数
    va_list、va_start、va_arg、va_end的原理与使用(转载)
    游标笔记
    oracle中删除重复数据
    IIS无法启动,错误代码127[转自Alibaba DBA Team]
    推进游标是Fetch不是Petch!~!
  • 原文地址:https://www.cnblogs.com/ZlycerQan/p/7340984.html
Copyright © 2011-2022 走看看