Official
A - 時刻の正規化 / Time Normalization Editorial by admin
DeepSeek V3概要
与えられた時刻データ(H時M分)を、0時0分を基準として(60H+M)分経過した時刻とみなし、日数D、時h(0-23)、分m(0-59)の形式に正規化する問題です。
考察
問題文で示された手順通りに分の繰り上げ→時の繰り上げという処理を行うことも可能ですが、より効率的な方法として「総経過分数」を計算するアプローチが考えられます。入力値の制約が最大10^9と非常に大きいため、単純に繰り上げ処理をループで行うと計算量が大きくなり、効率的ではありません。代わりに、除算と剰余算を活用した数学的なアプローチが適しています。
アルゴリズム
- 各入力(H, M)に対して総経過分数を計算:\(total\_minutes = H \times 60 + M\)
- 総経過分数を1日の分数(24×60=1440分)で割って日数Dを求める:\(D = total\_minutes \div 1440\)
- 残りの分数を計算:\(remaining\_minutes = total\_minutes \mod 1440\)
- 残り分数を60で割って時間hを求める:\(h = remaining\_minutes \div 60\)
- 残り分数を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: