Задача
На очередной день рождения ослику Иа-Иа подарили наручные стрелочные часы. Теперь у него появилось новое развлечение — смотреть на бег стрелок. На то, как минутная догоняет часовую, обходит и тут же продолжает бежать за ней. Вот и в этот раз Кенга застала ослика за этим занятием. Она присоединилась к наблюдением и через некоторое время ей стало интересно, сколько уже моментов, когда минутная стрелка обгоняет часовую, видел Иа-Иа. Для этого она спросила у ослика во сколько он начал смотреть на часы, записала это и текущее время и побежала к Сове с этим вопросом. Но Сова оказалось очень занята и поэтому попросила вас помочь. Как известно, за один день часовая стрелка делает два оборота, а минутная целых [latex]24[/latex].Входные данные
Первая строка входного файла содержит описание момента времени, в который Иа-Иа начал смотреть на часы в формате [latex]HH:MM[/latex] — две первых цифры обозначают часы, потом через двоеточие две цифры минут.
Вторая строка входного файла содержит описание конечного момента времени в таком же формате.
Известно, что Иа-Иа наблюдал за часами менее суток, но вполне мог это делать и в полночь.
Выходные данные
В выходной файл выведите единственное целое число — количество моментов, когда минутная стрелка обгоняет часовую в процессе наблюдения.
Если такое событие происходило когда Иа-Иа начал или закончил смотреть на часы, то оно также считается.
Тесты
Входные данные | Выходные данные |
[latex]23:50[/latex] | [latex]1[/latex] |
[latex]00:20[/latex] | |
[latex]12:00[/latex] | [latex]2[/latex] |
[latex]13:20[/latex] | |
[latex]00:00[/latex] | [latex]1[/latex] |
[latex]00:01[/latex] | |
[latex]00:00[/latex] | [latex]22[/latex] |
[latex]23:59[/latex] | |
[latex]18:32[/latex] | [latex]3[/latex] |
[latex]20:44[/latex] | |
[latex]00:00[/latex] | [latex]12[/latex] |
[latex]12:01[/latex] |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { public static void main (String[] args) throws Exception { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); String[] params1 = bufferedReader.readLine().split(":"); int h1 = Integer.parseInt(params1[0]); int m1 = Integer.parseInt(params1[1]); String[] params2 = bufferedReader.readLine().split(":"); int h2 = Integer.parseInt(params2[0]); int m2 = Integer.parseInt(params2[1]); long firstTimeInMinutes = h1 * 60 + m1; long secondTimeInMinutes = h2 * 60 + m2; long differenceOfTimes = (1440 + (secondTimeInMinutes - firstTimeInMinutes)) % 1440; secondTimeInMinutes = firstTimeInMinutes + differenceOfTimes; double r = (h1 % 12 + m1 + 1); long numberOfMeetings1 = firstTimeInMinutes * 11 / 720 + (long)Math.ceil((r - 1) / r); long numberOfMeetings2 = secondTimeInMinutes * 11 / 720 + 1; System.out.println(numberOfMeetings2-numberOfMeetings1); } } |
Решение задачи
Сначала найдем количество минут в момент времени, в который Иа-Иа начал смотреть на часы и в момент времени, в который закончил ([latex]firstTimeInMinutes[/latex] и [latex]secondTimeInMinutes[/latex] соответсвенно). Теперь найдем разницу между этими моментами ([latex]differenceOfTimes[/latex]), учитывая переход через момент времени [latex]00:00[/latex] по формуле: $\left(1440+secondTimeInMinutes-firstTimeInMinutes\right)\mod 1440$ ([latex]1440[/latex] — это количество минут в сутках). Присвоим моменту времени, когда Иа-Иа закончил смотреть, сумму «начала» и «разности моментов» (т. е [latex]firstTimeInMinutes+differenceOfTimes[/latex]). В сутках есть два момента, когда минутная и часовая стрелки точно совпадают-это [latex]00:00[/latex] и [latex]12:00[/latex]. Если время начала совпало с одним из этих моментов, то его не надо учитывать. Заведем переменную [latex]r[/latex], которая будет принимать значение [latex]1[/latex] в этих моментах времени, а иначе какое-то другое значение (нам оно не важно). Это можно сделать, например, так: $h_1\mod 12 + m_1 + 1$. Период встречи стрелок равен [latex]\frac{720}{11}[/latex]. Посчитаем количество встреч стрелок ([latex]numberOfMeetings2[/latex]) от начала суток до [latex]secondTimeInMinutes[/latex] : [latex]\frac{secondTimeInMinutes\cdot 11}{720}+1[/latex] (добавляем [latex]1[/latex] т. к момент [latex]00:00[/latex] тоже надо учитывать). Также посчитаем количество встреч стрелок ([latex]numberOfMeetings1[/latex]) от начала суток до [latex]firstTimeInMinutes[/latex]: [latex]\frac{firstTimeInMinutes\cdot 11}{720}+ \lceil\frac{(r-1)}{r}\rceil[/latex] ([latex] \lceil\frac{(r-1)}{r}\rceil[/latex] дает [latex]0[/latex] при совпадении начального времени с моментом [latex]00:00[/latex] или [latex]12:00[/latex], а иначе — [latex]1[/latex]). Ответом будет разность этих двух количеств ([latex]numberOfMeetings2-numberOfMeetings1[/latex]).
Вроде задача не на массивы? Они что-то тут дают?
Массивы не используются при решении. Я использовал их исключительно ради удобства ввода.