qduoj 102 一道非常简单的数学题(构造)

时间:2021-12-24 10:27:43

题意:给你三角形的边长a, b, c和一个L, L可以用来加长边,问加L后能形成的最大面积为多少。


思路:qduoj 102 一道非常简单的数学题(构造)根据海伦公式,可以看出,要使面积最大,就要让三条边竟可能相等,所以构造让他们差值最小即可。


代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
const int mod = 1e9+7;
double d[5];

double cal(double a, double b, double c)
{
double p = (a+b+c)/2;
return sqrt(p*(p-a)*(p-b)*(p-c));
}

int main(void)
{
int t;
cin >> t;
while(t--)
{
double l;
cin >> d[0] >> d[1] >> d[2] >> l;
sort(d, d+3);
double dif = d[1]-d[0];
if(dif < l)
{
l -= dif;
d[0] = d[1];
dif = (d[2]-d[1])*2;
if(dif > l)
d[0] = d[1] = d[1]+l/2.0;
else
{
d[0] = d[1] = d[2];
l -= dif;
d[0] = d[1] = d[2] = d[0]+l/3.0;
}
}
else d[0] += l;
printf("%.6f\n", cal(d[0], d[1], d[2]));
}
return 0;
}