(備忘録)AtCoderをやって6(Traveling)
問題
シカのAtCoDeerくんは二次元平面上で旅行をしようとしています。 AtCoDeerくんの旅行プランでは、時刻 0 に 点 (0,0) を出発し、 1 以上 N 以下の各 i に対し、時刻 t iに点 (x i、y i) を訪れる予定です。
AtCoDeerくんが時刻 t に 点 (x,y) にいる時、 時刻 t+1 には 点 (x+1,y), (x−1,y), (x,y+1), (x,y−1) のうちいずれかに存在することができます。 その場にとどまることは出来ないことに注意してください。 AtCoDeerくんの旅行プランが実行可能かどうか判定してください。 https://atcoder.jp/contests/abs/tasks/arc089_a (300 点)
自分の回答(他の方の解答参照)
自分で出来たところは、最初の4行くらいであとの処理部分は全く分からずでしたね。。。 解答を考える上でのポイントは、
最短到着時刻(最短距離) (点(0,0)から上下右左のいずれかに移動できる場合の最短到着時刻はX+Yで求めることができる)
T(予定時刻) と X+Y(最短到着時刻)の偶数と奇数が一致するか(X+Y(最短到着時刻)の座標が偶数の場合、その座標にはどんなに遠回りしても偶数になる性質があり)
詳しい説明はこちらが分かりやすいので参照
absは絶対値を返すメソッド Integer#abs (Ruby 3.1 リファレンスマニュアル)
問題解くには条件を考えることを意識する必要がありそうです。
N = gets.chomp.to_i a, b, c = [0, 0, 0] N.times { t, x, y = gets.chomp.split.map(&:to_i) #移動可能時刻と最短到着時刻を計算 time = (a - t).abs position_total = (b - x).abs + (c - y).abs if (t + x + y) % 2 != 0 || time < position_total puts "No" exit end #今回入力された値を記録(これを入れないとAtCoderのテストがパスしない) a = t b = x c = y } puts "Yes"