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.5∗sin60°
小的三角形面积:
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=e∗e∗0.5∗sin60°+c∗c∗0.5∗sin60°+a∗a∗0.5∗sin60°
一个边长为1的等边三角形面积:
S
3
=
0.5
∗
s
i
n
60
°
S_3=0.5*sin60°
S3=0.5∗sin60°
则答案为: S 1 − S 2 S 3 \frac{S_1-S_2}{S_3} S3S1−S2。
要注意的是要提前把式子中的 0.5 ∗ s i n 60 ° 0.5*sin60° 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;
}