题意:求已知两边(非直角边)的有一角为直角的四边形的最大面积。
思路:三分法。极端情况:1)给定两边在同一直线上,即构成的为直角三角形
2)四边形为矩形
一般情况:
四边形面积:Sabc + Sacd, max(Sabc)=
ac*ac/4.
Sacd可又海伦公式求得。其中ac是变动的,范围有1,2可知,利用三分法求最大面积。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define eps 1e-8
double getArea (double a, double b, double c) {
double p = (a + b + c)/2;
return (c*c/4 + sqrt(p*(p-a)*(p-b)*(p-c)));
}
int main()
{
double a, b, left, right, mid1, mid2, ans1, ans2;;
scanf("%lf %lf", &a, &b);
left = sqrt(a*a+b*b);
right = a + b;
while (fabs(right - left) > eps) {
mid1 = (left+right)/2;
mid2 = (left+mid1)/2;
ans1 = getArea(a, b, mid1);
ans2 = getArea(a, b, mid2);
if (ans1 > ans2)
left = mid2;
else
right = mid1;
}
printf("%.9lf\n", ans1);
return 0;
}