题目大意:
给出三角形的三个顶点 再给一条绳(绳长不超过三角形周长)
求绳子在三角形中能围出的最大面积
题解链接 http://blog.sina.com.cn/s/blog_6a46cc3f0100tujn.html
多边形和圆 周长相同时 圆的面积更大
而当绳长超过三角形的内接圆时
沿着边放 对应三角的三个位置围成三段圆弧
使得三段圆弧能围成一个圆时 面积就能更大
而此时这个小圆也会与小三角形内接 与大圆和大三角形相似
计算比例 k=(小三角周长-小内接圆周长)/(大三角周长-大内接圆周长)
那么此时 绳围面积=S大三角-(S小三角-S小内接圆)
按比例可得到小内接圆半径 可得 S小内接圆
又S大三角=底*高 -> 缩小k比例 -> S小三角=(k*底)*(k*高)=k*k*S大三角
#include<cstdio> #include<cmath> #include<iostream> #include<algorithm> using namespace std; const double PI=acos(-1.0); int main() { double a,b,c,d; int tcase=0; while(~scanf("%lf%lf%lf%lf",&a,&b,&c,&d)) { if(a+b+c+d==0) break; double L=a+b+c, l=L*0.5; double area=sqrt(l*(l-a)*(l-b)*(l-c)); double R=area*2.0/L, ans; if(a+b+c<=d) ans=area; else if(2.0*PI*R>=d) ans=d*d/(4.0*PI); else { double k=(L-d)/(L-2.0*PI*R); R*=k; // 得到小内接圆半径 ans=area-k*k*area+PI*R*R; } printf("Case %d: %.2f ",++tcase,ans); } return 0; }