Python3で解く AtCoder Beginner Contest 175 C - Walking Takahashi
移動している様子を書きながら、考えればできそう。 は正として考えればいいし、が小さめな時は0へどんどん向かっていけばいいし、動ける回数が余ったら、余った回数の偶奇で場合分けする。
概要
問題
1. 座標上のにいる。
1. 回動かなければいけない。
1. 1回で動ける距離はで+にも-にも動ける。
1. 回動いた後に0からの距離が最小となるように動き方をした時の距離は?
解くときに考えた内容
- まずは は負もあり得るが、条件から考えて、負でも正として考えて問題がないのでそのようにする。
- 負で考えると絶対値の計算で符号を逆にしなくてはいけないのでめんどくさい)
- 0の方向へ向かえばいいががマイナスの値にならないように動ける最小回数はである(とする)。(距離 // 移動距離ってこと)
- の時、つまりが小さいので、ただ0へ向かい続けられるだけ動いた時の0からの距離が最小値。
- の時、動ける回数が余っているということ。
- 動ける回数の余りが偶数なら、かの動きを続ければに必ず戻って来ればよく、それが最小値。
- 動ける回数の余りが奇数なら、はマイナスの値にならないように動ける最小回数なのであり、0までの距離を、とすると(等号成立はのとき、つまりのとき)であるので、側に向かうよりも側に向かうが最小値となる。
コード
x, k, d = map(int, input().split()) # xを正の数として考えても問題ない x = abs(x) # xから0へ向かって、マイナス方向に超えない範囲で最小の値になるために必要な移動数 count = x // d # kがcountより小さかったら、0へ向かって動けるだけ動く if count >= k: ans = x - (k*d) else: # 動ける回数が余って、かつ余りが偶数なら同じ位置に戻るように動き続ければいい。 if (k - count) % 2 == 0: ans = x - (count*d) # 動ける回数が余って、かつ余りが奇数なら+dより-dへ進む # a = abs(x - (count*d))とすると |a - d| ≦ |a + d| だから else: ans = x - (count+1) * d print(abs(ans))