1C.Ancient Berland Circus

1C. Ancient Berland Circus

一个正多边形,给你三个定点的坐标,求正多边形面积的最小值

  1. 根据海伦公式求出正多边形的外接圆的半径

    • 海伦公式

      • formula

      公式中a,b,c分别为三角形三边长,p为半周长,S为三角形的面积。

  2. 在外接圆半径大小唯一的情况下,要使正多边形面积最小,就是使正多边形的边数最少,也就是使得每条边所对应的圆心角最大。而最大圆心角 = 三角形三条边所对应的三个圆心角的公约数

  3. 求面积

#include <iostream>
#include <cmath>

using namespace std;

const double PI = 3.1415926;

double fgcd(double x,double y)
{
    if(y<0.01) return x;
    return fgcd(y,fmod(x,y));
}

int main()
{
    double a1,b1,a2,b2,a3,b3;
    while(~scanf("%lf%lf%lf%lf%lf%lf",&a1,&b1,&a2,&b2,&a3,&b3)){
    
        double n1,n2,n3;
        n1 = sqrt((a1-a2)*(a1-a2) + (b1-b2)*(b1-b2));
        n2 = sqrt((a1-a3)*(a1-a3) + (b1-b3)*(b1-b3));
        n3 = sqrt((a2-a3)*(a2-a3) + (b2-b3)*(b2-b3));
        
        //不给三条边排序会超时,我也不知道为啥。
        if(n1 > n2) swap(n1,n2);
        if(n2 > n3) swap(n2,n3);
        if(n1 > n2) swap(n1,n2);
        
        //求半径
        double q = (n1+n2+n3) / 2;
        double S = sqrt(q*(q-n1)*(q-n2)*(q-n3));
        double R = n1*n2*n3/(4*S);
        
        //用正弦定理求角度
        double angle1 = 2*acos((n2*n2 + n3*n3 - n1*n1)/(2*n2*n3));
        double angle2 = 2*acos((n1*n1 + n2*n2 - n3*n3)/(2*n1*n2));
        double angle3 = 2*PI - angle1 - angle2;
        
        //求最大公约数,是浮点数gcd和fmod
        double r = fgcd(angle1,fgcd(angle2,angle3));
        
        //求一个三角形的面积,再求多边形的面积
        double s1 = (R*R*sin(r))/2;
        double ans = s1*(2*PI/r);
        
        printf("%6lf\n",ans);
        
        return 0;
    }
    
}

printf("%6lf\n",ans);

    return 0;
}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值