CF1C Ancient Berland Circus 几何

博客详细解析了如何利用三个点求最小正多边形的面积,涉及圆心角计算、海伦公式、正弦定理和余弦定理的应用,强调精度在解题中的重要性,并提供了浮点数取余的自定义gcd函数代码片段。
摘要由CSDN通过智能技术生成

CF1C Ancient Berland Circus

传送门点这里
题意:利用三个点求最小正多边形的面积。
上图:
手稿,有点丑

思路:一个正多边形,其每个点必把圆平分,且中心事原点。设有:多边形在圆上的点把圆平分成了N段(就是像切蛋糕一样把圆切成了N块大小相等的蛋糕)。那么我们只需要求一个的大小,再乘以N。

N=2 * pi / t(t为每块的圆心角)

每块的面积为:R * R* sin t / 2

总面积为:pi * R * R * sin t / t

如此,我们只要求R和t就可以了。
首先利用海伦公式求出圆上三点的三角形的面积。

海伦公式:S = sqrt ( p * ( p - a ) * ( p - b ) * ( p - c ) )

p = ( a + b + c ) / 2;

利用海伦公式之前 我们先求出三角形每条边的长度(用两点间的距离公式即可)

有面积后 正弦定理求R 余弦定理求角(这个不说了)

求出∠AOC和∠OBC
既然我们要求每块的圆心角t,那么利用gcd找到单位角就可以了 单位角即为公约数
但是这是不正确的因为会有误差 所以我们需要第三个角∠AOB(大的那个,不是∠AOC+∠OBC)
用三个角求公约数,求出单位角t

警告:注意精度

自己写一个浮点数的gcd 精确到0.001即可 反正我不知道为何我精度切的更小的时候就WA了(小数取余用fmod函数)
最后保留6位小数即可
精度真的重要 也很玄学

代码如下:

#include <bits/stdc++.h>
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define fo1(a,b) for(int a=0;a<b;++a)
#define fo2(a,b) for(int a=1;a<=b;++a)
#define inf 0x3f3f3f3f
using namespace std
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值