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

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

JOI 一次予選 2022 (第 2 回) B - 短針 (7Q, 難易度 1)

シミュレーションしてもいいし、数学的に綺麗に解くこともできる!

問題概要

時計は 1 〜 12 を繰り返す。

 A 時の  B 時間後は、何時であるかを答えよ。

制約

  •  1 \le A \le 12
  •  1 \le B \le 100

解法 (1):シミュレーション

 A から出発して、 B 回以下のことを繰り返せばよい。

  • 1 増やす
  • 13 になったら 1 に戻す

for 文を用いて  B 回繰り返そう。

コード

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

int main() {
    int A, B;
    cin >> A >> B;
    for (int i = 0; i < B; ++i) {
        ++A;
        if (A == 13) A = 1;
    }
    cout << A << endl;
}

 

解法 (2):数学的に解く

「1, 2, ..., 12 を繰り返す」とか、「月, 火, ..., 日を繰り返す」など、このようなものを扱うには割り算などのコツがある。

このようなとき、繰り返すものについては 0 から開始する方が都合がよい。なので、今回も「1, 2, ..., 12 を繰り返す」は「0, 1, ..., 11 を繰り返す」に修正して考えよう。具体的には

  •  A を 1 減らす
  • その状態で  B を足して、答えを求める
  • 最後に 1 を足す

というようにすればよい。

その状態で  A B を足すと  A + B になる。この  A + B を 12 で割った余りが答えとなる (最後に 1 を足す)。

コード

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

int main() {
    int A, B;
    cin >> A >> B;
    --A;
    int res = (A + B) % 12;
    cout << res + 1 << endl;
}