mayoko’s diary

プロコンとかいろいろ。

AOJ 2629 Manhattan

解法

一方の点 A は x 軸と平行な直線の上に乗せて考えても問題ありません。こうすると, もう一方の点 B の位置によって場合分けができます。

B が y 軸と平行な直線の上に乗せられている場合
この場合は, A の位置をうまく調整すると, x0 + sqrt(d^2-x0^2) の最大値を取れば良いことが分かります。x0 について偏微分して = 0 になるところは x0 = d/sqrt(2) であることがわかるので, それで計算しましょう。

B が x 軸と平行な直線の上に乗せられている場合
d の整数部分だけ y 方向に進む ということをやったあと, x 軸方向に合計 1 稼ぐ, ということをできます(図)。

f:id:mayokoex:20160516183059p:plain

これらの中で最大のものが答えです。

int main() {
    double d;
    cin >> d;
    int d1 = d*1000;
    double ans = sqrt(2)*d;
    ans = max<double>(ans, (int)(d)+1);
    printf("%.10lf\n", ans);
    return 0;
}