AtCoder ABC 292 F Regular Triangle Inside a Rectangle

标签: atmath

给定一个 的矩形,求能放在矩形中最大的正三角形。

首先我们先假定 。我们假设答案三角形有至少一个顶点和长方形某个顶点重合。因为对于任意一个正三角形,每个角都是 ,必然存在一个顶点使得它是最左上/左下/右上/右下角,可以把这个角对齐到长方形的某一个顶点上。除了这个点,至少还有一个点在长方形的边上(除了那个和长方形端点对齐的点),否则答案可以更优。

triangle

如图, 是我们要求的答案三角形。 是和长方形对齐的角, 是在 上运动的点。 也是正三角形,可以证得 全等, 又是顶点,,所以 在如图的绿色直线上移动。 必须在长方形内,所以当 处在 上或 上时答案最优。

具体来说,当 时, 上,答案为 ,否则, 上,答案为

#define _USE_MATH_DEFINES

#include <cmath>
#include <iomanip>
#include <iostream>

int main()
{
	double a, b;
	std::cin >> a >> b;
	if (a > b) std::swap(a, b);

	std::cout << std::fixed << std::setprecision(15);

	auto maxl = a / std::cos(M_PI / 6);
	if (maxl < b) {
		std::cout << maxl << std::endl;
		return 0;
	}
	auto h = (maxl - b) * std::tan(M_PI / 3);
	std::cout << std::sqrt(b * b + h * h) << std::endl;
}

注意:使用 <cmath> 中的数学常数需要 _USE_MATH_DEFINES 宏。

推荐看看小日本的题解:F - Regular Triangle Inside a Rectangle 解説