Задача
На очередной день рождения ослику Иа-Иа подарили наручные стрелочные часы. Теперь у него появилось новое развлечение — смотреть на бег стрелок. На то, как минутная догоняет часовую, обходит и тут же продолжает бежать за ней. Вот и в этот раз Кенга застала ослика за этим занятием. Она присоединилась к наблюдением и через некоторое время ей стало интересно, сколько уже моментов, когда минутная стрелка обгоняет часовую, видел Иа-Иа. Для этого она спросила у ослика во сколько он начал смотреть на часы, записала это и текущее время и побежала к Сове с этим вопросом. Но Сова оказалось очень занята и поэтому попросила вас помочь. Как известно, за один день часовая стрелка делает два оборота, а минутная целых [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 |
#include <iostream> #include <cmath> using namespace std; int main() { long long h1, m1, h2, m2, sum, sum1=0, sum2=0, res1=0, res2=0; char a; cin >>h1>>a>>m1>>h2>>a>>m2; sum1=h1*60+m1; sum2=h2*60+m2; sum=(1440+(sum2-sum1))%1440; sum2=sum1+sum; double r; r=(h1%12+m1/12.0+1); res1=sum1*11/720+ceil((r-1)/r); res2=sum2*11/720+1; cout<<res2-res1; return 0; } |
Решение задачи
Сначала найдем количество минут в момент времени, в который Иа-Иа начал смотреть на часы и в момент времени, в который закончил ([latex]sum_1[/latex] и [latex]sum_2[/latex] соответсвенно). Теперь найдем разницу между этими моментами ([latex]sum[/latex]), учитывая переход через момент времени [latex]00:00[/latex] по формуле: $\left(1440+sum_2-sum_1\right)\mod 1440$ ([latex]1440[/latex] — это количество минут в сутках). Присвоим моменту времени, когда Иа-Иа закончил смотреть, сумму «начала» и «разности моментов» (т. е [latex]sum_1+sum[/latex]). В сутках есть два момента, когда минутная и часовая стрелки точно совпадают-это [latex]00:00[/latex] и [latex]12:00[/latex]. Если время начала совпало с одним из этих моментов, то его не надо учитывать. Заведем переменную [latex]r[/latex], которая будет принимать значение [latex]1[/latex] в этих моментах времени, а иначе какое-то другое значение (нам оно не важно). Это можно сделать, например, так: $h_1\mod 12 + \frac{m_1}{12} + 1$. Период встречи стрелок равен [latex]\frac{720}{11}[/latex]. Посчитаем количество встреч стрелок ([latex]res_2[/latex]) от начала суток до [latex]sum_2[/latex] : [latex]\frac{sum_2\cdot 11}{720}+1[/latex] (добавляем [latex]1[/latex] т. к момент [latex]00:00[/latex] тоже надо учитывать). Также посчитаем количество встреч стрелок ([latex]res_1[/latex]) от начала суток до [latex]sum_1[/latex]: [latex]\frac{sum_1\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]res_2-res_1[/latex]).
Ссылки
Условие задачи на e-olymp
Код решения
Зачтено, но замечания остались.
Хотя, я не уверен, что такое количество переменных с явно неудачными названиями может помочь понять ход решения. Обычно стараются так именовать переменные, чтобы не пришлось писать комментарии. У Вас же суммы с номерами, которые не суммы по смыслу. И результаты с номерами, которые не являются результатами…
Спасибо, учту.