けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

JOI 一次予選 2025 第 1 回 B - 散歩 (8Q, 難易度 1)

ちょっとした算数的な考え方が必要になる問題

問題概要

JOI 君は以下の行動を行動 A → 行動 B → 行動 A → ⋯ のように交互に繰り返す。

  • 行動 A:3m 前に進む
  • 行動 B:2m 後ろに戻る

行動を合わせて  X 回行うとき、何m進むか?

解法

このような問題を解くとき、 X のさまざまな値を試してみることが有効です。たとえば

  •  X = 1 のとき:3m
  •  X = 2 のとき:3 - 2 = 1m
  •  X = 3 のとき:3 - 2 + 3 = 4m
  •  X = 4 のとき:3 - 2 + 3 - 2 = 2m
  •  X = 5 のとき:3 - 2 + 3 - 2 + 3 = 5m
  •  X = 6 のとき:3 - 2 + 3 - 2 + 3 - 2 = 3m
  • ...

という感じです。これをみると、次のことがわかります。


 X が偶数である場合には、「3 - 2 = 1m の移動」を X / 2 X を 2 で割った商です)回繰り返す。

つまり、X / 2 m 進みます。


 X が奇数である場合も同様に、「3 - 2 = 1m の移動」を X / 2 X を 2 で割った商です)回繰り返したあと、「+3m の移動」を 1 回行います。

つまり、X / 2 + 3 m 進みます。

まとめ

まとめると、次のように整理できます。

  •  X が偶数のとき:X / 2 m
  •  X が奇数のとき:X / 2 + 3 m

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    int X;
    cin >> X;

    if (X % 2 == 0) {
        cout << X / 2 << endl;
    } else {
        cout << X / 2 + 3 << endl;
    }
}