Сдали как-то программисты проект в срок и получили премии. На радостях, прямо в ПН скинулись и на все деньги купили пива. В тот же день всё выпили, а во ВТ решили продолжить, но денег больше не осталось. Тогда они сдали бутылки, добавили вчерашнюю сдачу и снова затарились на все, как и вчера. То же проделали в СР и ЧТ. А в ПТ денег оказалось ровно на одну бутылку. Задумались — вспомнили цену одной бутылки, почём у них принимали тару (цены были без копеек), а сколько было денег изначально, никто назвать не смог. Проект был масштабный, премии большие — так что перебором не стоит. Каким же был минимальный бюджет в ПН, чтобы события сложились именно таким образом?Рассуждая над ней следующим образом
я пришёл к уравнению, которое в абстрактном виде выгядит так (1):
Без иллюзий на счёт первенства в этом вопросе, хочу лишь поделиться удовольствием, полученным в процессе. Если кто знает альтернативный метод или название этого, просветите меня; подобных мне призываю к обсуждению, а нетерпеливых – приглашаю под кат.
Рассмотрим полученное уравнение в таком виде (2):
Тогда я рассмотрел уравнение (1) в виде двух функций

В силу ступенчатого характера второй функции графики y1 и y2 пересекаются в двух точках: при x1 = 12 и x2 = 15, но согласно условию, нас интересует именно первое значение, как меньшее. Так вот, для того, чтобы без перебора определить область пересечения, я ввёл третью функцию — это просто прямая, которая ограничивает функцию y2 снизу и имеет уравнение
Теперь остаётся найти точку пересечения двух прямых (y1 и y3) и скорректировать ответ из ограничения на искомый x. Ведь исходя из условия, он может принимать только те значения, при которых соблюдается условие кратности числителя знаменателю в уравнении (2), т.е.
Поскольку в вопросе на Тостере стоял тег Python, ниже я приведу скрипт для решения этой задачи с использованием функции, для нахождения бюджета текущего дня на основании бюджета дня следующего. Применяем функцию нужное количество раз и, вуаля, получаем ответ!
def this_day_budget(next_day_budget): a = bottle_price - tare_return_price b = bottle_price c = next_day_budget x = (a - a*b + b*c)/(b - a) if (x - c) % a: # value does not match the increment x = ((x-c)//a + 1) * a + c return x bottle_price = 7 tare_return_price = 4 party_duration_days = 5 last_day_budget = bottle_price for days_to_party_end in range(party_duration_days): if days_to_party_end == 0: current_budget = last_day_budget else: current_budget = this_day_budget(current_budget) print('first day budget was - %d' % current_budget)
Вместо заключения:
задачей в данном примере были обусловлены как значения параметров

