【AtCoder】ABC 428 A - Grandma's Footsteps

実行時間制限: 2 sec / メモリ制限: 1024 MiB / Difficulty: 23 / NoviSteps: 6Q / 配点: 150

問題概要

高橋君はチャイムが鳴った直後から、以下の動作を繰り返し行う。

  • 毎秒 SS メートルの速さで AA 秒間走る。その後の BB 秒間は静止する。

チャイムが鳴ってから XX 秒が経過するまでに、高橋君は合計何メートル走るか求めよ。

制約

  • 1S151 \leq S \leq 15
  • 1A10001 \leq A \leq 1000
  • 1B10001 \leq B \leq 1000
  • 1X10001 \leq X \leq 1000
  • 入力される値はすべて整数

考察

(A+B)(A+B)秒のサイクルで走る距離と、その余りの時間で走る距離を分けて計算すればよい。

前者は SAXA+BSA \cdot \left\lfloor \frac{X}{A+B} \right\rfloor 、後者は Smin(A,Xmod(A+B))S \cdot \min(A, X \bmod (A+B)) と表せる。

実装例

CPP
1.#include <bits/stdc++.h>
2.using namespace std;
3.
4.template <class T1, class T2>
5.inline auto div_floor(T1 a, T2 b)
6.{
7. if (b < 0)
8. a *= -1, b *= -1;
9. if (a >= 0)
10. return a / b;
11. else
12. return (a + 1) / b - 1;
13.}
14.
15.// ======================================== //
16.
17.int main()
18.{
19. int S, A, B, X;
20. cin >> S >> A >> B >> X;
21.
22. int ans = S * A * div_floor(X, A + B);
23. int rem = X % (A + B);
24. ans += S * min(rem, A);
25.
26. cout << ans << endl;
27.
28. return 0;
29.}
atcoder.jp favicon

実装時間: 5 分以内

コメント

周期算、最近の ABC の 150 点問題でよく見られる。