読者です 読者をやめる 読者になる 読者になる

SRM514 Div2Easy MagicalGirlLevelOneDivTwo

大意
プレイヤーのいる座標(u, v) から、X, Y軸平行に絶対値距離d だけ離れてつくられる正方形の領域が、プレイヤーの勢力域であるとする。敵の座標(x, y)が与えられるので、敵を勢力域に入れるためにプレイヤーが初期位置 (0, 0) から移動すべきユークリッド距離の最小を求めよ。

解法
初期位置が(0, 0)で勢力域が正方形の領域で対称なので、敵の座標はx, yそれぞれについて絶対値をとってしまってよい。あとはx方向とy方向について差分をとりユークリッド距離を求めるだけ。ただし既に勢力域にある場合は移動する必要がないので、x, y それぞれの差分が 0 未満だったら 0 にならすようにする。

反省
最初サンプルを見ながら適当にコードを書いて、正しいかどうかの証明をしないでシステムテストに投げていた。ジャッジが通ることを確認した後コードの正当性はすぐに納得いったが、ジャッジを通す前には本当に正しいかどうかが気づかないという不思議。

class MagicalGirlLevelOneDivTwo {
public:
  double theMinDistance(int d, int x, int y) {
    x = abs(x), y = abs(y);
    int X = x - d < 0 ? 0 : x - d;
    int Y = y - d < 0 ? 0 : y - d;
    return sqrt(X*X+Y*Y);
  }
};