Дмитрий Саперов
Многим, наверное, кажется непонятным решение разработчиков:
a = int(input())
a = a*45 + (a//2)*5 + ((a+1)//2-1)*15
print(a//60 + 9, a%60)
Попробую пояснить логику. Итак, возьмем для начала ситуацию с нечетным числом уроков, пусть их будет 5 (возьмем за a). Как подсчитать время на малые (пятиминутки) и большие (пятнадцатиминутки) перемены? Понятно, что перемену после последнего урока мы не считаем, т. е. всего перемен будет 4 (всего перемен a -1), из них будет равное количество пятиминуток и пятнадцатиминуток. Значит и на пятиминутки, и на пятнадцатиминутки уйдет времени по (a-1)/2 (по половине из всего количества учитываемых перемен). Следовательно для ситуации с нечетным числом уроков формула подсчета времени на перемены такая:
5*(a-1)/2 + 15*(a-1)/2
С четными будет так: если взять за пример 6 уроков, то пятиминутки будут после 1, 3 и 5 уроков, т. е. формула подсчета пятиминуток простая: a/2. А вот пятнадцатиминуток будет меньше на одну (после 2 и 4), т. к. после 6 урока учебный день завершается и перемену отсиживать не надо. Поэтому для пятнадцатиминуток формула (a/2)-1.Выходит, что если количество уроков четное, то формула времени на перемены будет:
5*(a/2) + 15*(a/2-1)
Получилось 2 формулы:
- для нечетного: 5*(a-1)/2 + 15*(a-1)/2
- для четного: 5*(a/2) + 15*(a/2-1)
Если присмотреться, то с подсчетом для нечетного числа уроков, а именно ее части "(a-1)/2" есть одна особенность. Если число нечетное (допустим, 5), то (5-1)/2 = 2. Но на самом деле здесь мы можем заменить формулу "(a-1)/2" на "a//2", ведь 5//2 тоже будет 2.Теперь формулы выглядят так:
- для нечетного: 5*(a//2) + 15*(a//2)
- для четного: 5*(a/2) + 15*(a/2-1)
Точно также в формуле для четных можно "a/2" (4/2 = 2) поменять на "a//2" (4//2 = 2). Получается:
- для нечетного: 5*(a//2) + 15*(a//2)
- для четного: 5*(a//2) + 15*(a/2-1)
Теперь нужно будет еще раз уделить внимание формуле для нечетного числа уроков "a//2". На самом деле ее можно заменить на (a+1)//2-1. Проверяем: 5//2 = 2. Как и (5+1)//2 - 1 = 2.
На эту же формулу ((a+1)//2-1) можно заменить и "a/2-1", использующуюся для четного числа уроков. Ведь 4/2 - 1 = 1, как и 4+1//2 - 1 = 1. В итоге у нас совпала формула для четного и нечетного числа уроков и выглядит она так:
5*(a//2) + 15*((a+1)//2-1)
Прибавляем время на сами уроки (a*45) и получаем решение разработчиков. Честно говоря, я планировал понятно объяснить, но похоже какая-то замудренная хрень вышла, но раз написал, то уж оставлю, вдруг поможет кому.
https://www.youtube.com/watch?v=1cg_9FBg4e8
Условие:
В некоторой школе занятия начинаются в 9:00. Продолжительность урока — 45 минут, после 1-го, 3-го, 5-го и т. д. уроков перемена 5 минут, а после 2-го, 4-го, 6-го и т. д. — 15 минут.
|
Дан номер урока (число от 1 до 10). Определите, когда заканчивается указанный урок.
|
Выведите два целых числа: время окончания урока в часах и минутах.
Решение, найденное в Интернете:
1. a = int(input())
|
2. a = a*45 + (a//2)*5 + ((a+1)//2-1)*15
|
3. print(a//60 + 9, a%60)
Моё понимание данной задачи:
1. a * 45 - это суммарная продолжительность уроков с 1-го по введённый пользователем;
|
2.1. a // 2 - кол-во 5-иминутных перемен до заданного пользователем урока;
|
2.2. (a // 2) * 5 - это суммарная продолжительность 5-иминутных перемен до заданного пользователем урока;
|
3. ((a+1)//2-1)*15 - ?
ИЗ 3-ГО ПУНКТА "МОЕГО ПОНИМАНИЯ" МНЕ ПОНЯТНО ТОЛЬКО ЧИСЛО "15" (ЗДЕСЬ, ВИДИМО, РЕЧЬ ИДЁТ О СУММАРНОЙ ПРОДОЛЖИТЕЛЬНОСТИ 15-ИМИНУТНЫХ ПЕРЕМЕН...).
КАК ПОНЯТЬ ИМЕННО ВОТ ЭТО:
"((a+1)//2-1)"
???
Помогите мне, пожалуйста, разобраться в 3-м пункте, уважаемые посетители данного интернет-ресурса!!!