题意:给出4个边长,问能不能组成四边形。如果能组成四边形,求出最大的面积。
思路:首先想到的是用海伦公式求面积。因为面积的函数是单峰的,所以可以三分求出答案。但最后发现有很大的精度误差。
在网上找资料发现,原来是有公式的。
代码如下:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <utility>
using namespace std;
int T;
long double s[4];
int main(void)
{
int cas = 1;
scanf("%d", &T);
while(T--){
printf("Case %d: ",cas++);
for(int i = 0 ; i < 4; ++i)
scanf("%Lf", &s[i]);
sort(s,s+4);
bool ok=true;
if(s[3]>=s[1]+s[2]+s[0]) ok=false;
long double p=(s[0]+s[1]+s[2]+s[3])/2.0;
if(!ok)
printf("-1\n");
else
printf("%.6Lf\n",sqrtl((p-s[0])*(p-s[1])*(p-s[2])*(p-s[3])));
}
return 0;
}