Quadrilateral
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 890 Accepted Submission(s): 401
2 1 1 1 1 1 2 3 4
Case 1: 1.000000 Case 2: 4.898979
题目意思:给出4条边的边长,若可以组成4边形,则输出能组成的4边形的最大面积,若不能,则输出-1
这个题考查的应该是Bretschneider公式
记p=(a+b+c+d)/2 为半周长. 对于普通四边形,如果其一对内角和为θ,由于四边形的内角和为360度,因此另一对内角和为360-θ。
由Bretschneider公式,四边形面积S=√[(p-a)(p-b)(p-c)(p-d)-abcdcos^2(θ/2)]。
由此我们也可看到,在四边固定的情况下,要使四边形的面积最大,必须使cos^2(θ/2)越小越好,对角和为180度时cos^2(θ/2)=0为最小值。(这意味着两个对角和都为180度)。这样得出的四边形的四个顶点共圆,即属于圆内接四边形。面积最大值就由Brahmagupta公式所得:S=√[(p-a)(p-b)(p-c)(p-d)。
因此只知道4条边是不能完全确定这个四边形的,需再测量多一个角度或对角线。
很容易得到只有当4边中最大边的长度小于另外3边长度之和时才能组成4边形,
体现在公式中就是(p-a)*(p-b)*(p-c)*(p-d)需要>0,因为任一边不能大于或等于4条边总长的一半,不然该边就会大于另外3边长度之和;
#include<stdio.h>
#include<math.h>
int main(void)
{
double a,b,c,d,p,s;
int T,t;
scanf("%d",&T);
for(t=1;t<=T;t++)
{
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
p=(a+b+c+d)/2;
s=(p-a)*(p-b)*(p-c)*(p-d);
if(s>0)
printf("Case %d: %lf\n",t,sqrt(s));
else
printf("Case %d: -1\n",t);
}
return 0;
}