蒟蒻君的刷题日记Day3:CF1C Ancient Berland Circus

题目大意

给出多边形的三个顶点,求多边形最小面积。

解题思路

众所周知,这是一道计算几何题。

  • 很明显,正多边形的顶点肯定都在这三个顶点构成三角形的外接圆上;
  • 首先,我们可以求出外接圆的半径;
  • 然后,根据求出三角形的三个角,和对应圆心角;
  • 最后,枚举 3 − 100 3-100 3100边形,依次判断即可。

需要用到的芝士:

  1. 海伦公式 S = p ( p − a ) ( p − b ) ( p − c ) ( p = a + b + c 2 ) S=\sqrt {p(p-a)(p-b)(p-c)} \left( p=\frac{a+b+c}{2}\right) S=p(pa)(pb)(pc) (p=2a+b+c)
  2. 正多边形面积公式 S = n R 2 s i n A 2 S=\frac{nR^2sinA}{2} S=2nR2sinA

代码实现

#include <bits/stdc++.h>
using namespace std;
#define pi 3.1415926
struct node {
    double x, y;
} a[3];
double dis(node A, node B) {
    return sqrt((A.x - B.x) * (A.x - B.x)+(A.y - B.y) * (A.y - B.y));
}
double cos(double a, double b, double c) {
    return acos((a * a + b * b - c * c) / (2 * a * b));
}
double area(double a, double b, double c) { // 计算R
    double p = (a + b + c) / 2;
    return a * b * c / 4 / sqrt(p * (p - a) * (p - b) * (p - c));
}
bool check(double x) {  // 判断一个数是否为实数
    return fabs(x - (int)(x + 0.05)) < 1e-4;
}
// l: 三角形三边长度
// angle: 三角形三个角的角度
double l[3], angle[3];
int main() {
    for (int i = 0; i < 3; ++i) {
        cin >> a[i].x >> a[i].y;
    }
    l[0] = dis(a[0], a[1]);
    l[1] = dis(a[0], a[2]);
    l[2] = dis(a[1], a[2]);
    angle[0] = cos(l[1], l[2], l[0]) / pi;
    angle[1] = cos(l[0], l[2], l[1]) / pi;
    angle[2] = cos(l[0], l[1], l[2]) / pi;
    for (int i = 3; i <= 100; ++i) {
        if (check(angle[0] * i) && check(angle[1] * i) && check(angle[2] * i)) {
            cout << fixed << setprecision(6) << i * pow(area(l[0], l[1], l[2]), 2) * sin(2 * pi / i) / 2 << '\n';
            break;
        }
    }
    return 0;
}

Goodbye,大家明天(可能是今天,可能是后天,可能是 n ( n ∈ Z ) n(n \in Z) n(nZ)天后)再见鸭~

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒟蒻一枚

谢谢鸭~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值