题目意思就是,给出三个点的坐标,告诉你这三个点是某个正多边形中的三个点,让你求出这个正多边形的面积的最小值。
我们考虑到这个正多边形必然是内接在某个⚪里面,所以从圆心向这三个点连线,我们马上可以得到三个角,这三个角可以看作是正多边形内角的 某个倍数,所以我们找到这三个角的最大公因数是多少就相当于找到了内角,找到了内角就相当于找到了正多边形的面积,期间用到了余弦定理,三角形外接圆半径和三角形面积的关系,海伦公式。
#include<bits/stdc++.h>
using namespace std;
double pi=3.141592653589793238462643;
double pf(double a){
return a*a;
}
double gcd(double a,double b){
if (a<1e-3) return b;
if (b<1e-3) return a;
return gcd(b,fmod(a,b));
}
int main(){
double x1,y1,x2,x3,y2,y3;
cin>>x1>>y1;
cin>>x2>>y2;
cin>>x3>>y3;
double a = sqrt(pf(x1-x2)+pf(y1-y2));
double b = sqrt(pf(x1-x3)+pf(y1-y3));
double c = sqrt(pf(x2-x3)+pf(y2-y3));
double p = (a+b+c)/2;
double r=a*b*c/4/sqrt(p*(p-a)*(p-b)*(p-c));
double alpha=acos((2*pf(r)-pf(a))/2/r/r);
double beta=acos((2*pf(r)-pf(b))/2/r/r);
double gama=2*pi-alpha-beta;
double theta=gcd(gcd(alpha,beta),gama);
printf("%.8lf",sin(theta)*(pi/theta)*r*r);
}