有四根木棍,长度分别为 a b c d ,求着四根木棍组成四边形的最大面积。
输入格式
第一行包含一个整数 Ca ( Ca ≤ 10000 ) ,表示有 Ca 组测试数据,对于每组测试数据:
输入包含一行,该行包含四个整数 a b c d ( 1 ≤ a , b , c , d ≤ 1000 ) 。
输出格式
对于每组测试数据,输出 "Case c: ans" ,其中 c 表示测试数据编号, ans 表示最大的面积,小数点后保留六位,如果不能组成四边形,则 ans 处输出 -1 。
样例输入
3
1 2 4 8
2 3 4 5
6 3 2 5
样例输出
Case 1: -1
Case 2: 10.954451
Case 3: 13.416408
#include
using namespace std;
bool judge(double a,double b,double c,double d)
{
double total = a+b+c+d;
double maxn = max(a,b);
maxn = max(maxn,c);
maxn = max(maxn,d);
if(total > 2*maxn) //判断能否构成四边形
return true;
return false;
}
int main()
{
int n;
double a,b,c,d,sum,s;
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
cin>>a>>b>>c>>d;
if(judge(a,b,c,d))
{
s = (a+b+c+d)/2.0;
sum = sqrt((s-a)*(s-b)*(s-c)*(s-d));
printf("Case %d: %.6lf\n",i,sum);
}
else
printf("Case %d: -1\n",i);
}
return 0;
}
一般四边形面积公式: (百度 婆罗摩笈多公式)
推导:
(1)可以得到:S=
absinA+cdsinC
(2)由余弦定理可得:BD^2 = a^2+b^2-2abcosA = c^2+d^2-2cdcosC;
即: a^2+b^2-c^2-d^2 = 2abcosA-2cdcosC
(1)和(2)平方后相加(需要稍微的处理一丢丢)得:
4S^2+(a^2+b^2-c^2-d^2 )^2 /4 = (absinA+cdsinC)^2+(abcosA-cdcosC)^2;
4S^2+(a^2+b^2-c^2-d^2 )^2 /4 = (ab)^2+(cd)^2-2abcd(cos(A+C));
当A+C = 180°时即cos(A+C) = -1 面积S最小(看出来了吧)
则:
S^2 = ( (ab)^2+(cd)^2 +2*abcd )/4 - (a^2+b^2-c^2-d^2 )^2 /16;
S^2 = ( (2ab+2cd)^2- (a^2+b^2-c^2-d^2 )^2 ) / 16;
平方差公式后:
S^2 = ( (a+b)^2 - (c+d)^2)((c+d)^2 - (a+b)^2 )/16
平方差公式后:
S^2 =(a+b+c-d)(a+b+d-c)(a+c+d-b)(b+c+d-a);
S = (此时A,B,C,D位于其外接圆上)
其中s为半周长: