CF559A Gerald‘s Hexagon(几何)

CF559A Gerald’s Hexagon

题意:

按顺时针顺序给出一个六个内角全部都是 120 ° 120° 120°的六边形六条边的边长,求该六边形剖分成三条边边长全部为 1 1 1的等边三角形的个数.
保证该六边形能够剖分成若干个边长全部为 1 1 1的等边三角形.

思路:

正面想递推很难推出公式,所以考虑直接求面积。
假设六条边分别为 a , b , c , d , e , f , g a,b,c,d,e,f,g a,b,c,d,e,f,g

  • 可以考虑拆分成四个三角形,利用余弦和正弦定理求出六边形面积再除去一个小三角形的面积。

然而这种做法不可行,函数带来的精度误差还是比较大的。

观察题目,六个内角都是 120 ° 120° 120°。可以考虑每隔两条边向外延长。
延长图
延长造成的三角形是等边的,大的三角形也是等边的。考虑用大的三角形减去延长产生的三个小三角形。

大的三角形面积: S 1 = ( e + d + c ) ∗ ( e + d + c ) ∗ 0.5 ∗ s i n 60 ° S_1=(e+d+c)*(e+d+c)*0.5*sin60° S1=(e+d+c)(e+d+c)0.5sin60°
小的三角形面积: S 2 = e ∗ e ∗ 0.5 ∗ s i n 60 ° + c ∗ c ∗ 0.5 ∗ s i n 60 ° + a ∗ a ∗ 0.5 ∗ s i n 60 ° S_2=e*e*0.5*sin60°+c*c*0.5*sin60°+a*a*0.5*sin60° S2=ee0.5sin60°+cc0.5sin60°+aa0.5sin60°
一个边长为1的等边三角形面积: S 3 = 0.5 ∗ s i n 60 ° S_3=0.5*sin60° S3=0.5sin60°

则答案为: S 1 − S 2 S 3 \frac{S_1-S_2}{S_3} S3S1S2

要注意的是要提前把式子中的 0.5 ∗ s i n 60 ° 0.5*sin60° 0.5sin60°手动约掉,不然会有精度误差。

Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll q[2000];
ll sum[2000];
/**
 * 几何
 */
const double pi=acos(-1);
int main(){ 
	long double q3=sqrt(3.0);
	long double a,b,c,d,e,f;
	cin>>a>>b>>c>>d>>e>>f;
	double s=(e+d+c)*(e+d+c);
	double s1=e*e;
	double s2=a*a;
	double s3=c*c;
	cout<<(ll)(s-s1-s2-s3);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值