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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章