题目大意:给定一个三角形的三条边长和一根绳子的长度,求这根绳子在三角行内所能围成的最大面积
显然,围成的图形为圆形方能使面积最大化,因为当周长一定是,圆形的面积最大,
这么来有三种情况,圆在三角形内,三角形为圆的内接三角形,或者图形与三角形边相切。
利用海伦公式求三角形面积:已知三角形ABC三边为a,b,c
p=(a+b+c)/2
∴SΔ=√[p(p+a)(p+b)(p+c)] (海伦公式)
前两种就不说了,说说第三种,如图:
如图:绳子这样围成面积最大(弧长dc+cb+弧长ba+af+弧长fe+ed)且三个扇形会构成一个整圆o,与O1,O2,O3相连的直线都垂直三角形
绳长 - 三边小弧长 = 大三角形周长 - (eC + Cf + aA + Ab + cB + Bd,下面设为t ) = ( 三条粗线长)
r:R = t:大三角形周长(r为三个扇形构成的圆的半径,R为大三角形内切圆的半径) 这是因为三角形相似 过大三角形的内切圆圆心分别做各边的垂线(图未画出)就可以清楚的看出CfO3e这个四边形以及另外两个构成了一个三角形且与大三角形相似,三个扇形构成的圆是构成的三角形的内切圆。
大三角形周长
大三角形周长
通过以上就可以求出r了,所以answer = 大三角形面积S - 构成的小三角形的面积(S*(r*r)/(R*R) 等比性质) + 构成的小圆面积
代码:
#include<stdio.h>
#include<math.h>
const double pi=acos(-1.0);//反余弦计算π
int main()
{
double a,b,c,rope,S,s,area,R,r,k;
int i=0;
while(scanf("%lf%lf%lf%lf",&a,&b,&c,&rope)!=EOF)
{
i++;
if(a==0&&b==0&&c==0&&rope==0) break;
k=a+b+c;
s=k*0.5;
S=sqrt(s*(s-a)*(s-b)*(s-c));//计算三角形面积
R=S*2.0/k;//内接圆半径
if(a+b+c<=rope)
area=S;
else if(2.0*R*pi>=rope)
area=rope*rope/(4.0*pi);
else
{
r=(k-rope)/(k/R-2.0*pi);
area=S+pi*r*r-(r*r*S/(R*R));
}
printf("Case %d: %.2lf\n",i,area);
}
return 0;
}