【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)