Python

Как понять логику решения следующей задачи "ДЛЯ НАЧИНАЮЩИХ"?

Задача "Улитка" (Решение):

Условие:

Улитка ползет по вертикальному шесту высотой h метров, поднимаясь за день на aa метров, а за ночь спускаясь на b метров. На какой день улитка доползет до вершины шеста?
|
Программа получает на вход натуральные числа h, a, b.
|
Программа должна вывести одно натуральное число. Гарантируется, что a>b.

Моё понимание решения данной задачи:

1. a - b - это КПД улитки за период 1 д+н (день + ночь);
|
2. h / (a - b) - вот за сколько дней, как я считаю, эта улитка должна доковылять до вершины

Решение, найденное в Интернете:

1. h = int(input())
|
2. a = int(input())
|
3. b = int(input())
|
4. print(int((h - a - 1) // (a - b) + 2))

Абсолютно непонятна логика, по которой автор (по всей видимости это и есть та самая СВЕТЛАЯ ГОЛОВА, которая решила назвать эту задачу не иначе как "ДЛЯ НАЧИНАЮЩИХ") решил, что эту задачу нужно решать именно так...

ИЗ ВСЕГО "int((h - a - 1) // (a - b) + 2)" МНЕ ПОНЯТНО ТОЛЬКО "(a - b)" (по всей видимости это и есть тот самый КПД, о котором я думаю)!

А вот причём здесь вот эта хрень - "h - a - 1" и почему она по мнению СВЕТЛОЙ ГОЛОВЫ должна делиться на "КПД + 2" ???

Люди, помогите мне, пожалуйста, понять ход мыслей этого хм... автора задачи! Я просто в шоке с этого товарища!!!
За ПОСЛЕДНИЙ день улитка проползёт a - она достигнет вершины столба ДНЁМ и ей НЕ НАДО будет спускаться. За каждый день, КРОМЕ последнего, улитка проползает a-b (a вверх, b вниз).

Если ИСКЛЮЧИТЬ последний день (за который улитка проползёт не менее a), то понадобится math.ceil((h - a) / (a - b)) дней. Чтобы правильно обработать ситуацию a > h запишем выражение в виде:
max(0, math.ceil((h - a) / (a - b)))

Таким образом, всего понадобится max(0, math.ceil((h - a) / (a - b))) + 1 день.

А теперь финт ушами. Для натуральных p и q:
math.ceil(p / q) == (p - 1) // q + 1

Подставляем это равенство в получившуюся формулу и получаем:
max(0, (h - a - 1) // (a - b) + 1) + 1
Если убрать проверку, что h может быть меньше a, получаем:
(h - a - 1) // (a - b) + 2
РМ
Роман М
88 653
Лучший ответ
Николай Десятерик Хм.... Завтра в течение всего дня попытаюсь вникнуть в суть Вашего ответа на мой вопрос (очень надеюсь конечно, что одного завтрашнего дня мне хватит на это) и, если у меня ещё возникнут какие-то уточняющие вопросы к Вам по Вашему ответу, то напишу здесь в комментарии.
Ну а пока заранее благодарю за ответ! :-)
Вася ...777 Романов Если убрать проверку, что h может быть меньше или равно a, получаем:
некоторые были на верном пути... но не дотянули..
Михаил Громов
Михаил Громов
18 761
Я не програмист, но получится, что (а-б) *(h-a)+a - по моему так должно быть

А-б - это растояние улитки за день (день+ночь)

H-a - это растояние, которое она преодолеет за всё время-1 день

+а - последний день, чтобы добратбся до верщины, с которой нам уже не интересно скатится она или нет.. хз как это в пооге выразить, но задача и правда. детсская
Прежложеное решение и правжо странное
Fedor Kan
Fedor Kan
4 684
Николай Десятерик А может, за 1 день эта еб@@@@ улитка преодолеет всё-таки, а не "...H-a - это растояние, которое она преодолеет за всё время-1 день..."? Почему именно ???
h, a, b = map(int, input().split())
print(h / (a - b))

Вроде бы так. Но не факт
Ну то есть, если бы не было спуска за ночь мы бы просто h // a, а тут нам
накладывает дебафф на a в виде b, => мы просто из a вычитаем b,
а делим так же
почти понял
Што это? Это молитва?
В Ютубе посмотрите
Женя Реппа
Женя Реппа
68