e-olymp 111. Часы

Ссылка на условие задания: e-olymp.

Условие

Часы с боем пробивают каждый час такое количество ударов, сколько их есть на циферблате с цифрами от 1 до 12, и по одному разу тогда, когда минутная стрелка указывает на цифру 6. Зная начальное и конечное время в рамках одних календарных суток (выраженное в часах и минутах), подсчитать общее количество ударов на этом промежутке времени.

Входные данные.

Начальное и конечное время одних календарных суток в часах ($H$) и минутах ($M$) через пробел ([latex]0 \leq H \leq 23, 0 \leq M \leq 59[/latex]).

Выходные данные.

Ответ на задачу.

Тесты

Входные данные Выходные данные
Начальное и конечное время Количество ударов
13 30 15 10 7
0 00 23 59 180
12 30 12 30 1
22 22 22 25 0

Код.

Решение.

Заведем переменную, которая будет отвечать за количество пробитых ударов res. Если на часах 59 минут, то увеличиваем количество часов h1, и обнуляем значение минутной стрелки m1, для следующего круга. Если значение минутной стрелки равно 30 то увеличиваем переменную res на один. Если же минутная стрелка на 12, то есть 0 минут, то к res добавляем остаток от деления текущего количества часов на 12. Увеличиваем значение переменной m1 на 1. Повторяем, пока начальное время не будет совпадать с конечным.
Ссылка на решение задачи на сайте Try Haxe!

Альтернативное решение.

Также существует способ решения этой задачи без использования циклов. Для этого я использовала функцию FactTree, которая реализует арифметическую прогрессию. Эта функция считает сколько ударов совершили часы от 0 часов, до указанного в качестве параметра времени. Объясним принцип работы функции ProdTree.Пусть нам нужно найти сумму последовательных чисел от L до R, обозначим его как P(L, R). Разделим интервал от L до R пополам и посчитаем P(L, R) как P(L, M) + P(M + 1, R), где M находится посередине между L и R, M = (L + R) / 2. Заметим, что слагаемые будут примерно одинаковой длины. Аналогично разобьем P(L, M) и P(M + 1, R). Будем производить эту операцию, пока в каждом интервале останется не более двух слагаемых. Очевидно, что P(L, R) = L, если L и R равны, и P(L, R) = L + R, если L и R отличаются на единицу.

Ссылка на решение задачи на сайте Try Haxe!

3 thoughts on “e-olymp 111. Часы

      • Засчитываю как упражнение, но второе решение может быть много короче.

        Но я бы сделал проще:

        Убрал комментарии, чтобы помучились разбирать трюки 🙂
        Основная идея, чтобы посчитать количество ударов до назначенного времени. потом вычитанием находим количество ударов на отрезке. Правда пришлось исключить удары в начальный момент времени отняв 1 минуту.

Добавить комментарий