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: