Official

B - Misjudge the Time Editorial by Nyaan


この問題は実装をテーマとした問題です。
まず、\(h\)\(m\) 分という時刻が見間違えやすい時刻か?を判定する方法を考えましょう。
これは次のような手続きで判定することができます。(詳しくは実装例をご参照ください。)

  • \(h\)\(10\) の位 \(A\)\(1\) の位 \(B\) を整数除算 (C++ の /, Python の //) と剰余算 (%) を利用して求める。
  • \(m\)\(10\) の位 \(C\)\(1\) の位 \(D\) も同様に求める。
  • \(\mathrm{AC}\)\(\mathrm{BD}\) を加算・乗算を利用して計算する。
  • \(\mathrm{AC}\)\(\mathrm{BD}\) 分が \(24\) 時制に存在するかを判定する。これは \(0 \leq \mathrm{AC} \leq 23\) かつ \(0 \leq \mathrm{BD} \leq 59\) が成り立つかを調べれば判定できる。
  • 上の判定で得られた bool 値 (Yes/No) が、そのまま「\(h\)\(m\) 分という時刻が見間違えやすい時刻か?」という問題の答えになる。

見間違えやすい時刻の判定ができれば、この問題は while 文などのループ構造を利用すれば解くことができます。すなわち、 \(H\)\(M\) 分が見間違えやすい時刻でないあいだ \(1\) 分を足す、という操作を繰り返せばよいです。
ただし \(H\)\(M\) 分に \(1\) 分を足すと基本的には \(H\)\(M+1\) 分になりますが、足した後に \(H=24\)\(M=60\) になったときは繰り上がりが必要なのに注意してください。

計算量は \(\mathrm{O}( \text{(24 時制で表現できる時刻の通り数)})\) で、 24 時制で表現できる時刻は \(1440\) 通りなので十分高速に判定できると分かります。

Python による実装例は次の通りです。

def is_in_24_hours(h, m):
  return 0 <= h <= 23 and 0 <= m <= 59

def misjudged(h, m):
  A, B = h // 10, h % 10
  C, D = m // 10, m % 10
  AC = A * 10 + C
  BD = B * 10 + D
  return is_in_24_hours(AC, BD)

H, M = map(int, input().split())
while not misjudged(H, M):
  M += 1
  if M == 60:
    H, M = H + 1, 0
  if H == 24:
    H = 0
print(H, M)

posted:
last update: