見出し画像

ほぼ日刊競プロ ABC175 C - Walking Takahashi

C - Walking Takahashi

問題文
数直線上で暮らす高橋君は、今座標 X にいます。これから高橋君はちょうど K 回、座標の正または負の方向に D 移動する行為を繰り返そうと考えています。より正確には、1 回の移動では 座標 x から x+D または x−D に移動できます。高橋君は、ちょうど K 回移動した後にいる座標の絶対値が最小となるように移動したいです。K 回の移動後の座標の絶対値としてあり得る値の最小値を求めてください。

考えたこと

まずXの絶対値をとりXからK回Dずつ0に近づいていくと考える.
実際には3パターンあると考えた.
1.0の近くまで行けないパターン
2.0付近で行ったり来たりして,正側の最小値で止まるパターン
3.0付近で行ったり来たりして,負側の最小値で止まるパターン

1の場合はX-D*Xで終わり

2と3だが,正の最小値で止まった時に,残り何回動けるかで,答えが決まる.残り偶数回の場合は正の最小値に戻ってこれる.奇数回の場合負の最小値で止まる.
正の最小値で止まるまでの回数はK-(X//D)で求めることができる,XをDで何回割れるかを計算し,Kから引くのである.まとめると以下になる.

X,K,D = map(int,input().split())
X = abs(X)
if X-K*D>0:
   print (X-K*D)
   quit()
#残りの動ける回数が偶数か奇数か
if (K-(X//D))%2==0:
   print (X-D*(X//D))
else:
   print (abs(X-D*(X//D+1)))

この記事が気に入ったらサポートをしてみませんか?