Official

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

DeepSeek V3

概要

与えられた時刻データ(H時M分)を、0時0分を基準として(60H+M)分経過した時刻とみなし、日数D、時h(0-23)、分m(0-59)の形式に正規化する問題です。

考察

問題文で示された手順通りに分の繰り上げ→時の繰り上げという処理を行うことも可能ですが、より効率的な方法として「総経過分数」を計算するアプローチが考えられます。入力値の制約が最大10^9と非常に大きいため、単純に繰り上げ処理をループで行うと計算量が大きくなり、効率的ではありません。代わりに、除算と剰余算を活用した数学的なアプローチが適しています。

アルゴリズム

  1. 各入力(H, M)に対して総経過分数を計算:\(total\_minutes = H \times 60 + M\)
  2. 総経過分数を1日の分数(24×60=1440分)で割って日数Dを求める:\(D = total\_minutes \div 1440\)
  3. 残りの分数を計算:\(remaining\_minutes = total\_minutes \mod 1440\)
  4. 残り分数を60で割って時間hを求める:\(h = remaining\_minutes \div 60\)
  5. 残り分数を60で割った余りから分mを求める:\(m = remaining\_minutes \mod 60\)

この方法では、問題文の手順と同じ結果を得られますが、除算と剰余算のみで効率的に計算できます。

計算量

  • 時間計算量: \(O(N)\)
  • 空間計算量: \(O(N)\)

各データに対して定数時間の計算しか行わないため、入力サイズNに比例した計算量になります。

実装のポイント

  • 入力値が最大10^9と大きいため、整数演算で正確に処理する必要があります

  • 除算と剰余算を組み合わせることで、効率的に正規化を行えます

  • 出力フォーマットは「日数 時間 分」の順でスペース区切りとする必要があります

  • 一括読み込みを行うことで、大量の入力データに対しても高速に処理できます

    ソースコード

import sys

def main():
    data = sys.stdin.read().split()
    n = int(data[0])
    index = 1
    results = []
    for _ in range(n):
        H = int(data[index])
        M = int(data[index+1])
        index += 2
        
        total_minutes = H * 60 + M
        days = total_minutes // (24 * 60)
        remaining_minutes = total_minutes % (24 * 60)
        h = remaining_minutes // 60
        m = remaining_minutes % 60
        
        results.append(f"{days} {h} {m}")
    
    for res in results:
        print(res)

if __name__ == "__main__":
    main()

この解説は deepseekv3 によって生成されました。

posted:
last update: