CodeForces 1C

题意:给出正多边形的三个顶点,求正多边形的最小面积;
思路:
海伦公式: p=(a+b+c)/2,S=√p(p-a)(p-b)(p-c)(a,b,c为三角形的三边,S为三角形面积)
1.求外接圆半径r=a*b*c/4S
2.由余弦定理求出三个圆心角num[3]
(要注意的是,当三个点在同一段半圆弧上时,这时第三个圆心角应该用2π-num[0]-num[1],防止麻烦直接就令num[2]=2π-num[0]-num[1])
3.求这三个角的最大公约数为A, 那么这就是一个正2π/A边形.
4.三角形的面积S=1/2·r * r * sinA
5.2π/A*S即为所求.

#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<map>
#include<queue>
#include<cmath>
#include<stack>
#include<vector>
#include<cstdio>
#define MAXN 33000
#define INF 0x3f3f3f3f
#define lmid l,m,rt<<1
#define rmid m+1,r,rt<<1|1
#define ls rt<<1
#define rs rt<<1|1
#define Mod 1000000007
#define i64 __int64
#define LIMIT_ULL 100000000000000000
using namespace std;
const double PI = 3.1415926535;
double fgcd(double a,double b)
{
     if(b<=0.01)
     return a;
     return fgcd(b,fmod(a,b));
}
double num[3];
int main()
{
     double a,b,c,d,e,f;
     scanf("%lf %lf %lf %lf %lf %lf",&a,&b,&c,&d,&e,&f);
     double A=sqrt((a-c)*(a-c)+(b-d)*(b-d));
     double B=sqrt((e-c)*(e-c)+(f-d)*(f-d));
     double C=sqrt((a-e)*(a-e)+(b-f)*(b-f));
     double S=(A+B+C)/2;
     double SUM=sqrt(S*(S-A)*(S-B)*(S-C));
     double R=(A*B*C)/(4*SUM);
     num[0]=A,num[1]=B;
     for (int i=0;i<3;i++) num[i]=acos(1-num[i]*num[i]/(2*R*R));
     num[2]=2*PI-num[0]-num[1];
     double gcd=0;
     for(int i=0;i<3;i++)
     {
          gcd=fgcd(num[i],gcd);
     }
     //cout<<A<<" "<<B<<" "<<C<<" "<<S<<endl;
     //cout<<SUM<<" "<<R<<" "<<gcd<<endl;
     printf("%.6f\n", R*R*sin(gcd)*PI/gcd);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章