CF1C Ancient Berland Circus


题目来源CodeForces 1C
评测方式RemoteJudge
难度提高+/省选-

题意翻译

现在所有的马戏团在 Berland 都有一个直径13米的圆形竞技场, 但在过去的事情是不同的。
在古代 Berland 竞技场的马戏团被塑造成一个规则 (等角) 多边形, 角色的大小和角度可能因马戏团而异。竞技场的每个角落都有一根特别的柱子, 柱子之间的绳子标记着竞技场的边缘。
最近, 来自 Berland 的科学家发现了古代马戏团竞技场的遗迹。他们发现只有三根柱子, 其他的被毁坏了
你得到了这三根柱子的坐标。请找出竞技场中最小的区域。
输入三行,每行包含两个数字,表示柱子的坐标,坐标的绝对值不超过1000,小数点后不超过6位。
输出古代竞技场的可能的最小区域面积,精确到小数点后至少6位,保证在最佳答案中多边形角的数目不大于100。

题目描述

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.

输入格式

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 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.

输入输出样例

输入 #1
0.000000 0.000000
1.000000 1.000000
0.000000 1.000000
输出 #1
1.00000000

#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")

#include "bits/stdc++.h"
#define __max(a, b) (((a) > (b)) ? (a) : (b))
#define __min(a, b) (((a) < (b)) ? (a) : (b))
#define __mem(x) memset((x), 0, sizeof((x)))
using namespace std;

const long double EPS = 1E-5;
const int INF = (int)1E9;
const long long INF64 = (long long)1E18;
const long double PI = 2 * acos(.0);

long double getR(long double n, long double i, long double a)
{
i = min(i, n - i);
if (fabs(i * 2.0 - n) < EPS)
return 0.5 * a;
return 0.5 * a / cos(PI * (0.5 - i / n));
}

void check(long double a, long double b, long double c, int N, long double &s)
{
long double n = N;
for (int i = 1; i < N; i++)
for (int j = 1; j < N; j++)
if (i != j)
{
long double R1 = getR(n, i, a);
long double R2 = getR(n, j, b);
long double R3 = getR(n, abs(i - j), c);

if (fabs(R1 - R2) < EPS && fabs(R1 - R3) < EPS && fabs(R3 - R2) < EPS)
s = min(s, n * 0.5 * R1 * R1 * sin(2.0 * PI / n));
}
}

int main()
{
long double x1, y1;
cin >> x1 >> y1;
long double x2, y2;
cin >> x2 >> y2;
long double x3, y3;
cin >> x3 >> y3;

long double a = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
long double b = sqrt((x3 - x2) * (x3 - x2) + (y3 - y2) * (y3 - y2));
long double c = sqrt((x1 - x3) * (x1 - x3) + (y1 - y3) * (y1 - y3));

long double ans = 1E60;
for (int i = 3; i <= 100; i++)
check(a, b, c, i, ans);

cout.precision(10);
cout << fixed << ans << endl;

return 0;
}

评论

此博客中的热门博文

将博客部署到星际文件系统(IPFS)

高中地理必修一知识点总结

一场CF的台前幕后(下)