当前位置: 首页 > 工具软件 > Circus > 使用案例 >

CF C. Ancient Berland Circus

阳狐若
2023-12-01

C. Ancient Berland Circus
time limit per test2 seconds
memory limit per test64 megabytes
inputstandard input
outputstandard output
Nowadays all circuses in Berland have a round arena with diameter 13 meters, but in the past things were different.

In Ancient Berland arenas in circuses were shaped as a regular (equiangular) polygon, the size and the number of angles could vary from one circus to another. In each corner of the arena there was a special pillar, and the rope strung between the pillars marked the arena edges.

Recently the scientists from Berland have discovered the remains of the ancient circus arena. They found only three pillars, the others were destroyed by the time.

You are given the coordinates of these three pillars. Find out what is the smallest area that the arena could have.

Input
The input file consists of three lines, each of them contains a pair of numbers –– coordinates of the pillar. Any coordinate doesn’t exceed 1000 by absolute value, and is given with at most six digits after decimal point.

Output
Output the smallest possible area of the ancient arena. This number should be accurate to at least 6 digits after the decimal point. It’s guaranteed that the number of angles in the optimal polygon is not larger than 100.

Examples
inputCopy
0.000000 0.000000
1.000000 1.000000
0.000000 1.000000
outputCopy
1.00000000

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<string.h>
#include<algorithm>
using namespace std;
const double pi=3.1415926;//π
double mod(double a,double b)//小数取模
{
  return a-(int)(a/b)*b;
}
double gcd(double x,double y)//小数gcd
{
  if(y<=0.0001)return x;
  return gcd(y,mod(x,y));
}
double x,y,x2,y2,x3,y3;
int main()
{
  cin>>x>>y>>x2>>y2>>x3>>y3;
  //计算三角形三条边长
  double a=sqrt((x-x2)*(x-x2)+(y-y2)*(y-y2));
  double b=sqrt((x-x3)*(x-x3)+(y-y3)*(y-y3));
  double c=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3));
  double p=(a+b+c)/2;
  double r=(a*b*c)/(4*sqrt(p*(p-a)*(p-b)*(p-c)));//通过r=(abc)/(4s)得出外接圆半径
  //分别求出以三条边为低,外接圆半径为腰的三角形的顶角角度
  double angle1=acos(1-(a*a)/(2*r*r));
  double angle2=acos(1-(b*b)/(2*r*r));
  double angle3=2*pi-angle1-angle2;
  double angle=gcd(angle1,gcd(angle2,angle3))/pi*180;//题目所示的以正多边形边长为低接圆半径为腰的三角形的顶角角度
  double side=sqrt(2*r*r-2*r*r*cos(angle/180*pi));//求出正多边形的边长
  double P=(r*2+side)/2;
  double s=sqrt(P*(P-r)*(P-r)*(P-side))/*三角形面积*/*(360/angle)/*三角形个数*/;//计算面积
  cout<<fixed<<setprecision(6)<<s;//保留6位小数输出
  return 0;
}
 类似资料:

相关阅读

相关文章

相关问答