给定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}absin alpha  + frac{1}{2}cdsin eta $

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

$AC = {c^2} + {d^2} - 2cdcos eta $

消去AC,$frac{{{a^2} + {b^2} - {c^2} - {d^2}}}{2} = abcos alpha  - cdcos eta $

联立解得,

$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 eta  - sin alpha sin eta ) = {a^2}{b^2} + {c^2}{d^2} - 2abcdcos (alpha  + eta )$

要使S最大,$cos (alpha  + eta )$取-1;$alpha  + eta  = 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
",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
",i,s);
        
    }
} 
原文地址:https://www.cnblogs.com/elpsycongroo/p/6777584.html