【yukicoder】No.296 n度寝
使用言語
Python 3
問題文
ユキさんは目覚まし時計が鳴っても、N度寝をよくします。
もしユキさんがH時M分で初めて起床し、T分の感覚でN度寝した場合、最終的に起床する時刻は?時?分でしょうか?
入力
N H M T
出力
?(時)
?(分)
解答例
2 7 30 5
7
35
解放プロセス
N (N == 1) 度寝をする場合は、
|――――――――――|
寝ている 最後の起床
2(N==2)度寝する場合は、(T=20分)
|―――――ーーー|ーーー―――――|
寝ている 最初の起床 最後の起床
(7:30) (7:50)
3(N==3)度寝する場合は、(T=20分)
|―――――ーー|ーーー――――ー|ーーーーーーー―|
寝ている 最初の起床 2度目の起床 最後の起床
(7:30) (7:50) (8:10)
上記の図より、最初起床~最後の起床で加算される分の合計は
(N-1) * T
となる。
まとめてHに加算する時間を算出するために、一旦Mに(N-1) * Tを代入する。
加算される時間の算出方法は、
int(M / 60)
である。
出力する時刻は24時間周期なので、加算される時間が24時間以上なら、Hは24時間間隔でリセットされる。
例えば、int(M / 60)==602なら、時間の合計はH+602となる。
しかし、H+602を24時間周期で表示するために、602/24==25..余り2の計算を行う。
この場合、25回も24時間周期をリセットすることを表すので、25は無視する。
25回も24時間周期をリセットした時、時刻は00:00となり、残りの2を加算すると、時刻は2:00となる。
なので、int(M / 60)を加算したHを24で割った時の余りが最後に起床する時の時間である。
そして、1番最初でMに分の合計を加算されているので、時間を算出した時と同じようにすれば答えたでる。
M/60の答えは60分周期を値だけ繰り返すことを表し、
M%60の答えは最後に起床した時の分である。
回答コード
n,h,m,t = map(int,input().split()) m += (n-1)*t h = (h + int(m / 60)) % 24 m %= 60 print(h) print(m)