@pepl213

Как ускорить работу скрипта?

Задача:
Бутылки
(Время: 1 сек. Память: 16 Мб Сложность: 48%)

Группа программистов собралась в понедельник и на все свои деньги купила «Sprite» в бутылках емкостью по 0.25 л., не забыв взять сдачу.

Во вторник они сдали пустую посуду, добавили оставшуюся сдачу и вновь купили столько таких же бутылок «Sprite», сколько могли.

Так они действовали до пятницы. В пятницу, сдав посуду и добавив сдачу с четверга, они смогли купить только одну бутылку напитка. При этом денег у них уже не осталось.

Требуется написать программу, определяющую минимальную сумму, которой располагали программисты в понедельник.
Входные данные

Входной файл INPUT.TXT состоит из единственной строки, содержащей два целых числа F (стоимость одной бутылки «Sprite») и P (стоимость одной пустой бутылки из под «Sprite»), разделенных пробелом.

Ограничения: 1 ≤ P < F ≤ 109, начальная сумма не превосходит 2×109.
Выходные данные
В единственную строку выходного файла OUTPUT.TXT нужно вывести одно целое число – минимальную сумму, которой располагали программисты в понедельник.

Пример:
7 3
Пт.7
Чт.11
Ср.19
Вт.39
Пн. 83
<br>
F,P = map(int,input().split()) #7 3<br><br>
def f(Q, deep):<br>
    if deep == 5:<br>
        return Q<br>
    for x in range(Q, 100*Q):<br>
        if x == Q+ (F-P)*(x//F):<br>
            break<br>
    return f(x,deep+1)<br>
print(f(F,1)) <br>

12 тест не проходит по времени (На Си тоже самое)
Как ускорить время выполнения скрипта.
Предыдущее кол-во денег можно посчитать по формуле x - (F-P)(x div F) = Q , где x - минимальное число, которое подходит для выполнения равенства. Q- кол-во денег в этот день.
В пятницу оно равно F.
  • Вопрос задан
  • 400 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега Алгоритмы
♬♬
В начале у ребят только деньги. В конце 1 пустая бутылка и весь выпитый напиток без посуды.
Начальное кол-во денег минус P делится без остатка на (F - P)

Работающее решение на JavaScript
function f(F, P) {
  const D = F - P; // стоимость напитка без посуды

  // сколько останется денег если 1 раз купить, выпить и сдать?
  function drink(m) {
    const n = Math.floor(m / F);
    if (n <= 0) throw "Nope";
    return m - n * D;
  }
  
  for( let M = P + D * Math.ceil((F + 1) / D); M <= D * Math.floor(2 * 109 / D); M += D) {
    try {
      if (F === drink(drink(drink(drink(M))))) return M;
    } catch(e) {
      continue;
    }
  }
}

f(7, 3) // 83
spoiler
import math

F,P = map(int, input("Введите два целых через пробел:").split())


def bruteforce(F, P):
    D = F - P
    
    def drink(m):
        n = math.floor(m / F)
        if 0 == n:
            raise Exception()
        return m - n * D
	

    for M in range(P, int(1e9), D):
        try:
            rem = drink(drink(drink(drink(M))))
            if (F == rem):
                return M
        except Exception as E:
            pass
            
    return "Нет решения"

print(bruteforce(F, P))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы