Official

E - Boombox Editorial by keisuke6


\(2H < W\) の場合、答えは明らかに \(\frac{H}{2}\) なので \(2H > W\) とします。


このとき、次が成立します。

  • 半径 \(R\) の円盤を条件を満たすように詰める方法が存在する \(\rightarrow\) 半径 \(R\) の円盤をそれぞれの円盤が長方形の辺のうちある垂直な2辺と接するように詰める方法が存在する
端的に言うと、円盤は長方形の隅のほうに寄せることができるということです。(これは帰納法を用いて証明することができます。ここでは割愛します。)

よって、半径の最大値 \(R (2R < \min(H,W)) \)\(2R = \sqrt{(H-2R)^2+(W-2R)^2}\) を満たしています。両辺とも円盤の中心どうしの距離を表しています。 この方程式を解くことで \(R = \frac{H+W-\sqrt{2HW}}{2}\) であることがわかるため、これを出力すればよいです。

なお、方程式を解く部分は \(2R < \sqrt{(H-2R)^2+(W-2R)^2}\) かどうかを判定する二分探索によっても解くことができます。

想定解 (C++)

#include <bits/stdc++.h>
using namespace std;

int main(){
    long long H, W;
    cin >> H >> W;
    if(H > W) swap(H, W);
    if(2*H <= W) cout << fixed << setprecision(15) << H / 2.0 << endl;
    else cout << fixed << setprecision(15) << (H + W - sqrt(2 * H * W)) / 2 << endl;
}

posted:
last update: