【AtCoder】ABC175 Walking Takahashi
公開: 2023/10/26
https://atcoder.jp/contests/abc175/tasks/abc175_c
解答プロセス(雑)
-
現在地は座標X
-
K回、Dだけ移動(正の方向、負の方向)
-
移動総量はK * Dとなる
-
abs(X) - K * D
をすればいいのでは? -
それだと現在座標が0に近い場合には答えが出せない
-
Xが正の座標の場合は
X - D
を行う -
上記でまだXが正の場合は繰り返す。負の場合も同様
-
Xが負になった場合には
X + D
を行う -
上記をK回繰り返せば良さそう
-
制約ではKが
10^15
なのでK回ループではTLEになる -
0までに何回使うのかを計算できれば良い
-
X - K*D >= 0
が成立すれば良い -
つまりKは
X/D
となる -
KがX/D以下の場合には0を往復している場合も考慮する
-
往復する場合は、KからX/Dを引く
-
結果が偶数→
X - (X/D * D)
-
結果が奇数→
X - (X/D * D) - D
-
最後に
abs()
を使って絶対値にする
実装
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define repi(i, init, n) for (int i = init; i < (int)(n); i++)
using ll = long long;
int main()
{
ll x, k, d;
cin >> x >> k >> d;
x = abs(x);
ll ans;
if (k <= x / d)
{
ans = x - k * d;
}
else
{
k -= x / d;
x -= x / d * d;
if (k % 2 == 1)
x -= d;
ans = abs(x);
}
cout << ans << endl;
}