CF559A Gerald‘s Hexagon(几何)

CF559A Gerald's Hexagon

题意:

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

思路:

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

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

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

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

大的三角形面积:\(S_1=(e+d+c)*(e+d+c)*0.5*sin60°\)
小的三角形面积:\(S_2=e*e*0.5*sin60°+c*c*0.5*sin60°+a*a*0.5*sin60°\)
一个边长为1的等边三角形面积: \(S_3=0.5*sin60°\)

则答案为:\(\frac{S_1-S_2}{S_3}\)

要注意的是要提前把式子中的\(0.5*sin60°\)手动约掉,不然会有精度误差。

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;
}
posted @ 2020-07-12 11:07  Qquun  阅读(58)  评论(0)    收藏  举报