• codeforces1C


    Ancient Berland Circus

     CodeForces - 1C 

    如今,Berland 的所有马戏表演都有一个圆形的竞技场,其直径为 13 米,但过去的情况有所不同。

    在古代 Berland,马戏表演的竞技场的形状为 (等角) 正多边形,其尺寸和角的度数在各马戏表演中可能各不相同。在竞技场的每个角上,有一根特殊的台柱,并且在不同台柱之间系上绳子用以标识竞技场的各条边。

    最近,来自 Berland 的科学家们已经发现了某处古代马戏表演竞技场的遗址。他们只发现了三根台柱,其余的则随时间而损毁。

    给定了这三根台柱的坐标。请找出该竞技场可能具有的最小面积。

    输入

    输入文件包含了三行,它们中的每行包含了一对数字 –– 台柱的坐标。任何方向的坐标,其绝对值均不超过 1000,且给出了小数点后至多 6 位的数字。

    输出

    输出古代竞技场可能的最小面积。该数值应当精确到小数点后至少 6 位数字。数据确保:最佳多边形的角度数不超过 100 。

    示例

    输入
    0.000000 0.000000
    1.000000 1.000000
    0.000000 1.000000
    输出
    1.00000000

    sol:这三个点肯定在这个三角形的外接圆上,求出圆心,求出半径,然后余弦定理求出三个圆心角,但是求Gcd很蛋碎,一开始我把eps弄成1e-8,疯狂WA,改成1e-4就过了
    #include <bits/stdc++.h>
    using namespace std;
    typedef int ll;
    inline ll read()
    {
        ll s=0;
        bool f=0;
        char ch=' ';
        while(!isdigit(ch))
        {
            f|=(ch=='-'); ch=getchar();
        }
        while(isdigit(ch))
        {
            s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
        }
        return (f)?(-s):(s);
    }
    #define R(x) x=read()
    inline void write(ll x)
    {
        if(x<0)
        {
            putchar('-'); x=-x;
        }
        if(x<10)
        {
            putchar(x+'0'); return;
        }
        write(x/10);
        putchar((x%10)+'0');
        return;
    }
    #define W(x) write(x),putchar(' ')
    #define Wl(x) write(x),putchar('
    ')
    double ax,ay,bx,by,cx,cy;
    const double PI=acos(-1),eps=1e-4;
    inline double Sqr(double x)
    {
        return x*x;
    }
    inline double Jis(double x1,double y1,double x2,double y2)
    {
        return sqrt(Sqr(x2-x1)+Sqr(y2-y1));
    }
    inline double Jis2(double x1,double y1,double x2,double y2)
    {
        return Sqr(x2-x1)+Sqr(y2-y1);
    }
    inline double gcd(double x,double y)
    {
        while(fabs(x)>eps&&fabs(y)>eps)
        {
            if(x>y) x-=floor(x/y)*y;
            else y-=floor(y/x)*x;
        }
        return x+y;
    }
    int main()
    {
        double Zx,Zy;
        scanf("%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&cx,&cy);
        double a=2*(bx-ax),b=2*(by-ay),c=Sqr(bx)+Sqr(by)-Sqr(ax)-Sqr(ay);
        double d=2*(cx-ax),e=2*(cy-ay),f=Sqr(cx)+Sqr(cy)-Sqr(ax)-Sqr(ay);
        Zx=(c*e/b-f)/(a*e/b-d);
        Zy=(c*d/a-f)/(b*d/a-e);
        double r=Jis(ax,ay,Zx,Zy),r2=Jis2(ax,ay,Zx,Zy);
        double ab=Jis(ax,ay,bx,by),ac=Jis(ax,ay,cx,cy),bc=Jis(bx,by,cx,cy);
        double ab2=Jis2(ax,ay,bx,by),ac2=Jis2(ax,ay,cx,cy),bc2=Jis2(bx,by,cx,cy);
        double Ang_ab=2.*acos((ac2+bc2-ab2)/(2.*ac*bc));
        double Ang_ac=2.*acos((ab2+bc2-ac2)/(2.*ab*bc));
        double Ang_bc=2.*acos((ac2+ab2-bc2)/(2.*ac*ab));
        double Ang_Z=gcd(Ang_ac,gcd(Ang_ab,Ang_bc));
        double S=.5*r*r*sin(Ang_Z);
        printf("%.15lf
    ",(2.*PI/Ang_Z)*S);
        return 0;
    }
    /*
    input
    0.000000 0.000000
    1.000000 1.000000
    0.000000 1.000000
    output
    1.00000000
    
    Input
    71.756151 7.532275
    -48.634784 100.159986
    91.778633 158.107739
    Output
    9991.278665811225
    
    Input
    18.716839 40.852752
    66.147248 -4.083161
    111.083161 43.347248
    Output
    4268.87997505
    
    Input
    88.653021 18.024220
    51.942488 -2.527850
    76.164701 24.553012
    Output
    1452.52866331
    */
    View Code

    Ps:我afo了,QAQ

     
  • 相关阅读:
    【作业】第二周作业, 适合14级1/2班
    【作业】第二周作业,适合13级1/2/3班
    【组织】请13级1/2/3班,14级1/2班 将同学们的博客地址列个清单回复(按班级来)
    【组织】13级1、2、3班和14级1、2班 结对、分组情况请回帖
    【转】没什么能够阻挡,你对自由的向往
    【转】小屁孩, 懂个啥
    【转】远程结对编程实战:看看别人是怎么做的
    【转】看见成长的自己:斯坦福大学心理学教授徳韦克访谈
    【作业】第一周作业
    从std::thread::id取得int值id
  • 原文地址:https://www.cnblogs.com/gaojunonly1/p/10810223.html
Copyright © 2020-2023  润新知