HDU 4386(计算几何+婆罗摩笈多公式一般形式)

来源:互联网 发布:知乎周刊pdf 编辑:程序博客网 时间:2024/05/16 15:52

问题描述:

 One day the little Jack is playing a game with four crabsticks. The game is simple, he want to make all the four crabsticks to be a quadrilateral, which has the biggest area in all the possible ways. But Jack’s math is so bad, he doesn’t know how to do it, can you help him using your excellent programming skills? 

Input

 The first line contains an integer N (1 <= N <= 10000) which indicates the number of test cases. The next N lines contain 4 integers a, b, c, d, indicating the length of the crabsticks.(1 <= a, b, c, d <= 1000) 

Output

 For each test case, please output a line “Case X: Y”. X indicating the number of test cases, and Y indicating the area of the quadrilateral Jack want to make. Accurate to 6 digits after the decimal point. If there is no such quadrilateral, print “-1” instead. 

Sample Input

21 1 1 11 2 3 4
Sample Output

Case 1: 1.000000Case 2: 4.898979

题目题意:题目给我们四条边长,问可不可以构成四边形,如果可以那么请输出最大的四边形的面积,不行输出-1。

题目分析:四边形存在的充要条件是最大的边长小于其他三边之和。如果存在四边形怎么求四边形的最大面积了。

现在给出四边形面积的一般性结论,对于任意四边形它的面积:


不难发现,我们要四边形的面积最大,即A等于90°,那么此时的四边形是一个圆内接四边形

代码如下:

#include<iostream>#include<cstdio>#include<cmath>#include<cmath>#include<algorithm>using namespace std;int a[4];int main(){    int t,icase=1;    scanf("%d",&t);    while (t--) {        scanf("%d%d%d%d",&a[0],&a[1],&a[2],&a[3]);        sort (a,a+4);        if (a[3]>=(a[1]+a[2]+a[0])) {            printf("Case %d: -1\n",icase++);            continue;        }        else {            double s=(double)(a[0]+a[1]+a[2]+a[3])/2.0;            double area=sqrt((s-a[0])*(s-a[1])*(s-a[2])*(s-a[3]));            printf("Case %d: %.6f\n",icase++,area);        }    }    return 0;}














原创粉丝点击