Official

A - 時刻の正規化 / Time Normalization Editorial by admin

GPT 5.2 High

概要

各予約時刻 \((H, M)\) を「基準の \(0\)\(0\) 分から \((60H+M)\) 分後」とみなし、\(D\) 日後の \(h\)\(m\) 分(\(0 \le h \le 23,\,0 \le m \le 59\))に正規化して出力します。

考察

重要なのは「分→時→日」の繰り上げは、割り算と余り(整数除算と剰余)で一発で求められるという点です。

  • 分の繰り上げは、\(60\) 分で \(1\) 時間増えるので
    \(H' = H + \left\lfloor \dfrac{M}{60} \right\rfloor,\quad m = M \bmod 60\)
  • 時の繰り上げは、\(24\) 時間で \(1\) 日増えるので
    \(D = \left\lfloor \dfrac{H'}{24} \right\rfloor,\quad h = H' \bmod 24\)

素朴に「\(M\)\(60\) 以上なら \(M -= 60, H += 1\) を繰り返す」「\(H\)\(24\) 以上なら \(H -= 24, D += 1\) を繰り返す」とすると、\(M, H\) が最大で \(10^9\) なので繰り返し回数が非常に大きくなり、\(N \le 10^5\) では確実に TLE になります。
そこで、繰り返しをせずに \(//\)\(\%\) でまとめて計算します。

具体例:\((H, M) = (25, 80)\)
- \(H' = 25 + 80//60 = 25 + 1 = 26\)
- \(m = 80 \% 60 = 20\)
- \(D = 26//24 = 1\)
- \(h = 26 \% 24 = 2\)
よって \(1\) 日後の \(2\)\(20\) になります。

アルゴリズム

各データ \((H, M)\) について以下を行います。

  1. \(H' \leftarrow H + (M // 60)\)
  2. \(m \leftarrow M \% 60\)
  3. \(D \leftarrow H' // 24\)
  4. \(h \leftarrow H' \% 24\)
  5. \(D, h, m\) を出力

これを \(N\) 件分独立に繰り返します。

計算量

  • 時間計算量: \(O(N)\)(各行あたり定数回の演算)
  • 空間計算量: \(O(N)\)(出力を一旦配列に貯める実装のため。逐次出力なら \(O(1)\) でも可)

実装のポイント

  • Python では整数除算は //、剰余は % を使います。

  • \(N\) が大きいので、sys.stdin.buffer.read() でまとめて読み、出力も "\n".join(...) でまとめて書くと高速です。

  • 問題文の手順どおりに Hp -> (D,h) の順で計算するとミスが減ります。

    ソースコード

import sys

def main():
    it = iter(sys.stdin.buffer.read().split())
    n = int(next(it))
    out_lines = []
    for _ in range(n):
        H = int(next(it))
        M = int(next(it))
        Hp = H + M // 60
        m = M % 60
        D = Hp // 24
        h = Hp % 24
        out_lines.append(f"{D} {h} {m}")
    sys.stdout.write("\n".join(out_lines))

if __name__ == "__main__":
    main()

この解説は gpt-5.2-high によって生成されました。

posted:
last update: