JOI logo
第21回日本情報オリンピック 一次予選(第2回)

2021年10月18日
情報オリンピック日本委員会

問題
  短針 (Hour Hand) (配点 100点)
  時間制限 : 2 sec / メモリ制限 : 1024 MB

解説

この課題には複数の解法が考えられる.以下に主な 2 つの方針を挙げ,参考にするべきソースコードを紹介する.

方針 1: 数学的な構造を見抜き,単純な計算として実装する

12 から後の番号も,12 の次が 1313 の次が 14,...というふうに重ねて付けてみる.目盛りが 12 個進むごとに 1 周するので,番号を 12 で割った余りによって各目盛りに分類できる.具体的には,

A の目盛りから B 個進んだら,番号は A+B になる.したがって A+B12 で割った余りを計算し,上の対応から目盛りに対応づければよい.

1 から 11 までは余りそのままで,0 の場合のみ 12 となるので,この 2 つの場合について条件分岐を行えばよい(C/C++ といった言語であれば if 文で実現できる).

C++ の実装例 1 や Python の実装例がこの方針を採用しているので,参考にできるだろう.

方針 2: そのままシミュレーションする

「番号を次の目盛りのものに更新する」,すなわち「12 であれば 1 にし,それ以外であれば番号に 1 加える」という操作を B 回行えばよい.操作内の条件分岐のほか,繰り返し処理が必要となる(C/C++ といった言語であれば for 文で実現できる).

C++ の実装例 2 がこの方針を採用しているので,参考にできるだろう.

総括

この課題では四則演算・余りの計算のほか,条件分岐の処理が実装できることが求められている.また,繰り返し処理が書けるなら方針の幅が広がる課題でもある.

方針選択の観点では,「数学的な構造を見抜く」「シミュレーション」のいずれも非常に基礎的かつ重要な視点である.より難しい課題ではこれらの方針を使い分け,時に併用することが求められるだろう.