coderforce 1c--Ancient Berland Circusp

一道几何题,先是海伦定理:三角形三边为a,b,c,  外接圆半径为R;

 p=(a+b+c)/2;

 S=sqrt( p*(p-a)*(p-b)*(p-c) ) ;

再由正弦定理:S=a*b*c/(4*R);  由    \frac{a}{\sin A}=\frac{b}{\sin B}=\frac{c}{\sin C}=2R推出。

由上述公式可求出外接圆半径R;

再由余弦定理:\cos A=\frac{b^2+c^2-a^2}{2bc} 求出三角形中的其中2个边对应的圆心角的大小(即2个半径R和一条三角形边组成的三角形),另外一角可由2pie减去已求出的2角。3角均求出之后,再求3角的最大公约数即为所求最小正多边形的圆心角x,只要求出每个小三角形的面积再乘以多边形边数N(即2pie/x);

利用海伦定理变形:S=a*b*sinC/2;求每个小三角形的面积。

#include<cstdio>  
#include<map>  
#include<cstring>  
#include<cmath>  
#include<vector>  
#include<algorithm> 
#include<iostream>  
#include<set>  
#include<string>  
#include<queue>  
#define PI acos(-1.0)
#define MAX 1005
using namespace std;
double getR(double a,double b,double c){
    double p,R,area; 
    p=(sqrt(a)+sqrt(b)+sqrt(c))/2;
    area=p*(p-sqrt(a))*(p-sqrt(b))*(p-sqrt(c));
    R=sqrt(a*b*c/area)/4;
    return R;
}
double fgcd(double a,double b){
    if(fabs(a)<1e-2) return b;
    if(fabs(b)<1e-2) return a;
    return fgcd(b,fmod(a,b));
}
int main(){
    double d[4][3],angle[5],x[4],a,b,c,R,s;
    int i;
    for(i=1;i<4;i++){
        scanf("%lf %lf",&d[i][1],&d[i][2]);
    }
    a=(d[1][1]-d[2][1])*(d[1][1]-d[2][1])+(d[1][2]-d[2][2])*(d[1][2]-d[2][2]);
    b=(d[1][1]-d[3][1])*(d[1][1]-d[3][1])+(d[1][2]-d[3][2])*(d[1][2]-d[3][2]);
    c=(d[3][1]-d[2][1])*(d[3][1]-d[2][1])+(d[3][2]-d[2][2])*(d[3][2]-d[2][2]);
    R=getR(a,b,c);
    x[1]=a,x[2]=b,x[3]=c;
    for(i=1;i<3;i++)
        angle[i]=acos(1-(x[i+1]/(2*R*R)) ); 
    angle[3]=2*PI-angle[1]-angle[2];
    angle[4]=fgcd(angle[1],fgcd(angle[2],angle[3])); 
    s=R*R*PI*sin(angle[4])/angle[4];
    printf("%.6lf\n",s);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值