山傘のプログラミング勉強日記

プログラミングに関する日記とどうでもよい雑記からなるブログです。

[yukicoder] No.296 n度寝

時刻に関する問題

No.296 n度寝 - yukicoder

アルゴリズムの問題で時刻に関するものは色々あると思いますが、今回はyukicoderで出された問題を考えたいと思います。

f:id:yamakasa3:20180502191650p:plain

考え方

この問題で初めてアラームが鳴る時刻は、 H M 分です。時刻の単位を分だけで表すと一日のある時刻  x は、  0 \leq x \lt 1440 分になります。 この考えのもとに問題を解きます。

解法

ここで、

 k = 60H + M

とします。

ユキさんがアラームが鳴ってから寝る時間  t は、

 t = (N - 1)T

となります。 0 \leq x \lt 1440 から、最終的な起床時刻を考えると、

 t_1 = t \mod 1440

 x = k + t_1 または、  x = k - (1440 - t_1)

となります。ここで、 x 0 \leq x \leq1440 を満たすものです。(この方法では、  x = 1440 を満たすことがあります。)

時刻  x 分を時間を用いて表すには、

 \lfloor \dfrac{x}{60} \rfloor x \mod 60 分となります。 ここで、 \dfrac{x}{60} = 24 のときの時刻は 0 0分とします。

コード

import java.util.Scanner;

public class Exec0296 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int N = scan.nextInt();
        int H = scan.nextInt();
        int M = scan.nextInt();
        int T = scan.nextInt();
        scan.close();

        int t = H * 60 +  M;
        int max = 24 * 60;
        int k = ((N - 1) * T) % max;
        //System.out.println(k);
        int m = 0;
        if(k <= max - t) {
            m = t + k;
        }else {
            m = k - (max - t);
        }
        int ans1 = m / 60;
        int ans2 = m % 60;
        if(ans1 == 24) {
            System.out.println(0);
            System.out.println(0);
            System.exit(0);
        }
        System.out.println(ans1);
        System.out.println(ans2);
    }
}