A - 時刻の正規化 / Time Normalization Editorial by admin
Qwen3-Coder-480B概要
与えられた「時」と「分」の組を、正しい日付・時刻(何日後、何時、何分)に変換する問題。
考察
この問題は、単位の変換と剰余・商の計算によって解ける基本的な問題です。
まず、分の値 \(M\) が \(60\) 以上でも入力されるため、これを適切に「時の繰り上がり」に変換する必要があります。
例えば、\(80\) 分は \(1\) 時間 \(20\) 分なので、\(80 \div 60 = 1\) を時間に足し、残り \(80 \bmod 60 = 20\) を新しい分の値とします。
次に、更新された時間 \(H'\) が \(24\) 以上であれば、これは「日数の繰り上がり」を意味します。
例えば、\(25\) 時間は \(1\) 日 \(1\) 時間なので、\(25 \div 24 = 1\) 日、残り \(25 \bmod 24 = 1\) 時間となります。
このように、商(//)と剰余(%)の計算を順に行うことで、正規化された日数・時・分を求めることができます。
なお、制約より \(H, M\) は最大で \(10^9\) までありえるため、素朴なシミュレーション(例:ループで1分ずつ増やすなど)はTLEになります。数学的に一発で求める方法が求められます。
アルゴリズム
以下の手順で各時刻データを正規化します。
分の繰り上げ
- 新しい時間 \(H'\) を \(H + \left\lfloor \frac{M}{60} \right\rfloor\) とする。
- 新しい分 \(m\) を \(M \bmod 60\) とする。
時の繰り上げ
- 日数 \(D\) を \(\left\lfloor \frac{H'}{24} \right\rfloor\) とする。
- 正規化後の時間 \(h\) を \(H' \bmod 24\) とする。
最終的に、\(D\), \(h\), \(m\) を出力すればよいです。
具体例
入力が 25 80 の場合:
- 分の繰り上げ:\(H' = 25 + \left\lfloor \frac{80}{60} \right\rfloor = 25 + 1 = 26\)、\(m = 80 \bmod 60 = 20\)
- 時の繰り上げ:\(D = \left\lfloor \frac{26}{24} \right\rfloor = 1\)、\(h = 26 \bmod 24 = 2\)
よって出力は 1 2 20
計算量
- 時間計算量: \(O(N)\)
- 空間計算量: \(O(1)\)
各データに対して定数時間で処理できるため、全体で線形時間で解けます。
実装のポイント
商と剰余の計算は整数演算で十分高速です。
入力の範囲が非常に大きい(最大 \(10^9\))ので、ループなどでシミュレーションしないこと。
変数名は \(H', h, m, D\) のように整理して、意味を明確にするとコードが読みやすくなります。
ソースコード
N = int(input())
for _ in range(N):
H, M = map(int, input().split())
# 分の繰り上げ
H += M // 60
m = M % 60
# 時の繰り上げ
D = H // 24
h = H % 24
print(D, h, m)
この解説は qwen3-coder-480b によって生成されました。
posted:
last update: