给定4根长度的线段,求组成四边形的最大面积

 

解题关键:最大面积即4个点都在其外接圆上时的面积。

$p = (a + b + c + d)/2$

$s = \sqrt {(p - a)(p - b)(p - c)(p - d)}$

设四边形的四个点分别为A,B,C,D,四条边为a,b,c,d

$s = \frac{1}{2}ab\sin \alpha  + \frac{1}{2}cd\sin \beta $

再由余弦定理,$AC = {a^2} + {b^2} - 2ab\cos \alpha $

$AC = {c^2} + {d^2} - 2cd\cos \beta $

消去AC,$\frac{{{a^2} + {b^2} - {c^2} - {d^2}}}{2} = ab\cos \alpha  - cd\cos \beta $

联立解得,

$4{S^2} + \frac{1}{4}{({a^2} + {b^2} - {c^2} - {d^2})^2} = {a^2}{b^2} + {c^2}{d^2} - 2abcd(\cos \alpha \cos \beta  - \sin \alpha \sin \beta ) = {a^2}{b^2} + {c^2}{d^2} - 2abcd\cos (\alpha  + \beta )$

要使S最大,$\cos (\alpha  + \beta )$取-1;$\alpha  + \beta  = \pi $

而由圆周角为圆心角的一半,对角和为180度的四边形有外接圆;对角和不是180度的四边形,没有外接圆。

将$s^2$利用平方差公式进一步化简,最终得到

${S^2} = \frac{1}{4}({a^2}{b^2} + {c^2}{d^2} + 2abcd) - \frac{1}{{16}}{({a^2} + {b^2} + {c^2} + {d^2})^2} = \frac{1}{{16}}[(a + b + c - d)(a + b - c + d)(a - b + c + d)(b + c + d - a)]$

即最顶端的公式,圆内接四边形面积公式

 

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
using namespace std;
typedef long long ll;
double a[10];
int main(){
    ll t;
    scanf("%lld",&t);
    ll i;
    for(i=1;i<=t;i++){
        scanf("%lf%lf%lf%lf",a,a+1,a+2,a+3);
        sort(a,a+4);
        if(a[3]>=a[0]+a[1]+a[2]){
            printf("Case %lld: -1\n",i);
            continue;
        }
        double p=(a[1]+a[2]+a[3]+a[0])/2;
        double s=sqrt((p-a[0])*(p-a[1])*(p-a[2])*(p-a[3]));
        printf("Case %lld: %.6lf\n",i,s);
        
    }
} 

 

posted @ 2017-04-27 22:00  Elpsywk  阅读(1200)  评论(0编辑  收藏  举报