CodeForces 1C

来源:互联网 发布:现代通信网络试题 编辑:程序博客网 时间:2024/05/29 11:55

题意:给出正多边形的三个顶点,求正多边形的最小面积;
思路:
海伦公式: 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 100000000000000000using 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);}