首先,不难发现,最好的情况就是等边三角形,当且仅当 $ max(a, b) / min(a, b) <= 2 sqrt(3) / 3 $ 时成立,此时为 $ 2 sqrt(3) / 3 * min(a, b) $ 。
若不满足,则算 $ sqrt(max(a, b) ^ 2 + min(a, b) ^ 2 + sqrt(3) max(a, b) min(a, b)) $ 即可。
#include <bits/stdc++.h>
using namespace std;
int main()
{
double a, b;
cin >> a >> b;
if (a > b)
{
swap(a, b);
}
if (b / a >= 2 * sqrt(3) / 3)
{
printf("%.20lf", 2 * sqrt(3) / 3 * a);
}
else
{
printf("%.20lf", 2 * sqrt(a * a + b * b - sqrt(3) * a * b));
}
return 0;
}