Тема 23. Оператор присваивания и ветвления

23.08 Прочие прототипы

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела оператор присваивания и ветвления
Решаем задачу:

Ошибка.
Попробуйте повторить позже

Задача 1#30474

Исполнитель Щелчок преобразует число на экране. У исполнителя есть две команды:

1. Прибавить 1

2. Умножить на 2

Программа для исполнителя — это последовательность команд.

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

Показать ответ и решение

Рекурсивный способ решения

Мы можем использовать рекурсивную функцию f(x, y), которая считает количество программ, преобразующих число x в число y. Логика работы функции следующая:

1. Если текущее число x больше целевого y, возвращаем 0, так как нельзя превысив цель достичь её.

2. Если x == y, возвращаем 1, так как найден один подходящий путь.

3. В остальных случаях рекурсивно считаем количество программ для двух возможных команд: прибавить 1 и умножить на 2, суммируя результаты.

Далее перебираем все числа от 2 до 99. Для каждого числа y проверяем, если количество программ равно 36, добавляем его в множество a. После перебора выводим минимальное число из множества, что соответствует минимальному направлению.

# Определяем рекурсивную функцию для подсчета количества программ
def f(x, y):
    # Если текущее число больше целевого, пути нет
    if x > y:
        return 0
    # Если достигли целевого числа, найден путь
    if x == y:
        return 1
    # Рекурсивно считаем все возможные переходы: прибавить 1 или умножить на 2
    return f(x + 1, y) + f(x * 2, y)

# Создаем множество для хранения чисел, для которых количество программ равно 36
a = set()
# Перебираем числа от 2 до 99
for y in range(2, 100):
    # Если количество программ равно 36, добавляем число в множество
    if f(1, y) == 36:
        a.add(y)

# Выводим минимальное число из множества
print(min(a))

Динамический способ решения

Динамический способ позволяет избежать многократного пересчета одних и тех же значений. Мы создаём массив a, где a[i] хранит количество программ, которые преобразуют число 1 в число i.

1. Инициализируем массив нулями: a = [0] * 100.

2. Задаём исходное условие: a[1] = 1, так как из числа 1 в 1 существует один путь.

3. Перебираем все числа i от 1 до 29 включительно. Для каждого числа выполняем следующие шаги:

- К числу i+1 добавляем количество программ из числа i, так как можно прибавить 1.

- Если число i*2 не превышает размер массива, добавляем к нему количество программ из числа i, так как можно применить команду умножения на 2.

4. После заполнения массива ищем индекс числа, где количество программ равно 36 с помощью a.index(36), и выводим его.

# Создаем массив для хранения количества программ
a = [0] * 100
# Исходное число 1, одна программа длины 0
a[1] = 1

# Перебираем числа от 1 до 29
for i in range(1, 30):
    # Прибавляем к следующему числу количество программ текущего числа
    a[i + 1] += a[i]
    # Умножаем текущее число на 2 и добавляем количество программ
    a[i * 2] += a[i]

# Находим минимальное число, для которого количество программ равно 36
print(a.index(36))

Ответ: 16

Специальные программы

Все специальные программы

Программа
лояльности v2.0

Приглашай друзей в Школково и получай вознаграждение до 10%!

Крути рулетку
и выигрывай призы!

Крути рулетку и покупай курсы со скидкой, которая привязывается к вашему аккаунту.

Бесплатное онлайн-обучение

Для школьников из приграничных территорий России, проживающих в ДНР, ЛНР, Херсонской, Запорожской, Белгородской, Курской, Брянской областях и Крыму.

Налоговые вычеты

Узнай, как получить налоговый вычет при оплате обучения в «Школково».

Специальное предложение
для учителей

Бесплатный доступ к любому курсу подготовки к ЕГЭ, ОГЭ и олимпиадам от «Школково». Мы с вами делаем общее и важное дело, а потому для нас очень значимо быть чем-то полезными для учителей по всей России!

Вернём деньги за курс
за твою сотку на ЕГЭ

Сдать экзамен на сотку и получить обратно деньги за подготовку теперь вполне реально!

cyberpunkMouse
cyberpunkMouse
Рулетка
Вы можете получить скидку в рулетке!