AtCoder Beginner Contest 175 「C - Walking Takahashi」をC#で解いたら
C問題を解くが目標になっているため、勉強しています。
その過程で作ったAtCoderのC問題のコード、コメント多めで載せてみます。
順位表の解答が早い順で見れば、コードの解答は分かりますが、何をやっているのかいまいちわからないときがあります。
そんな時、コメント沢山ついているコードがあればいいなと思うことがあるため、誰かのためになれば良いなと思います。
「C - Walking Takahashi」の問題は、AtCoderさんのリンクからご確認ください。
コード
往復移動する前と往復移動する後で条件分けをして考えます。
往復移動に入ると+D, -Dを繰り返します。
using System; using System.Linq; class program { static void Main() { var line = Console.ReadLine().Split(' ').Select(x => long.Parse(x)).ToArray(); long X = line[0]; // 現在地 var K = line[1]; // 移動回数 var D = line[2]; // 移動距離 long ans = X; // K回後の最小の絶対値 // moveTimesToRoundTrip: 往復移動をするまでに必要な移動回数 // Xがマイナスでも答えは変わらないため絶対値で計算 // 切り捨ててもKは整数であるため同じ値になる var moveTimesToRoundTrip = Math.Abs(X) / D; if (moveTimesToRoundTrip >= K) { // 往復移動をしない場合 // 現在地から移動回数*移動距離を足し引きして求める if (X >= 0) { ans = X - K * D; } else { ans = X + K * D; } } else { // 往復移動をする場合 // distanceBeforeRoundTrip: 往復移動する前の距離 var distanceBeforeRoundTrip = X % D; // roundTripTimes: 往復回数 // 原点近くにたどり着くまでにmoveTimesToRoundTripかかる // 残りの回数roundTripTimesは原点をまたいで-D, +Dを繰り返す var roundTripTimes = K - moveTimesToRoundTrip; if (roundTripTimes % 2 == 0) { // 偶数回移動するなら // 往復移動しても往復移動する前の距離が答え ans = distanceBeforeRoundTrip; } else { // 奇数回移動するなら // 往復移動する前の距離が正なら移動距離Dを引いて // 往復移動する前の距離が負なら移動距離Dを足す if (distanceBeforeRoundTrip > 0) { ans = distanceBeforeRoundTrip - D; } else { ans = distanceBeforeRoundTrip + D; } } } Console.WriteLine(Math.Abs(ans)); } }