二分探索で求める方法もありますが、ここでは直接求めていきます。
平面上で (0,0), (A,0), (A,B), (0,B) を頂点とする長方形の内部に入る正三角形を考えていくことにします。
1辺の長さが の正三角形の頂点の一つを原点(0,0) におくと、残りの2つの頂点の座標は と表せます。
この正三角形が長方形の内部に入るための条件は、
です。 0 以上という条件から、 の範囲は と決まります。
この範囲では、
なので、
つまり、
が成り立てば長方形の内部です。
とおけば、 の小さいほうが の上限です。
が大きくなると は大きくなる増加関数で、 は小さくなる減少関数です。
そのため、 で であれば を小さくすることで の上限を増加させることが可能です。
逆に で であれば を大きくすることで の上限を増加させることが可能です。
となる条件、すなわち のとき、 はこれ以上小さくできないため、 が の上限です。
となる条件、すなわち のとき、 はこれ以上大きくできないため、 が の上限です。
整理すると、
のとき が最大値
のとき が最大値
になります。
この条件に当てはまらない場合は、 になる で が最大になります。
この式から を求めて を計算すれば、これが最大値になります。
コード例 (Julia)
function solve() # 入力 readInts() = parse.(Int,split(readline())) readInt() = parse(Int,readline()) A,B = readInts() s3 = sqrt(3.0) if s3 * A > 2B println(2B/s3) return end if 2A < s3 * B println(2A/s3) return end theta = atan(2B / A - s3) println(A/cos(theta)) end # function solve # main solve()