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)\) について以下を行います。
- \(H' \leftarrow H + (M // 60)\)
- \(m \leftarrow M \% 60\)
- \(D \leftarrow H' // 24\)
- \(h \leftarrow H' \% 24\)
- \(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: