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

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

Задача 1#30490

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

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

2. Прибавить 3

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

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

Сколько существует различных результатов выполнения программ, содержащих 10  команд и начинающих свою работу из 2  . При этом траектория вычислений исполнителя содержит не более трех нечетных чисел.

Траектория вычислений — это последовательность результатов выполнения всех команд программы. Например, для программы 123  при исходном числе 2  траектория будет состоять из чисел 3,6,18  .

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

Стоит сказать, что динамическое решение данной задачи получается достаточно трудоемким. Поэтому рекомендуется решать эту задачу с помощью рекурсии.

Решение 1 (Рекурсия)

def f(st, count_odd, count, end_count):
    global A
    if count == end_count and count_odd <= 3:
        A.add(st)
    if count_odd > 3 or count > end_count:
        return
    f(st + 1, count_odd + (st % 2 == 0), count + 1, end_count)
    f(st * 3, count_odd + (st % 2 == 1), count + 1, end_count)
    f(st + 3, count_odd + (st % 2 == 0), count + 1, end_count)
A = set()
f(2, 0, 0, 10)
print(len(A))

Решение 2 (Динамика)

ans, otv = set(), set()
ans.add((2, 0))
for operations in range(10):
    can_get = set()
    for i in ans:
        ch, chet = i
        if chet + (ch + 1) % 2 <= 3:
            can_get.add((ch + 1, chet + (ch + 1) % 2))
        if chet + (ch + 3) % 2 <= 3:
            can_get.add((ch + 3, chet + (ch + 3) % 2))
        if chet + (ch * 3) % 2 <= 3:
            can_get.add((ch * 3, chet + (ch * 3) % 2))
    ans = can_get
for i in ans:
    a, b = i
    otv.add(a)
print(len(otv))

Ответ: 602

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

Задача 2#30484

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

1. Прибавить квадрат числа

2. Прибавить целую часть квадратного корня числа, если корень возможно извлечь

3. Вычесть 12

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

Сколько существует различных результатов выполнения программ, содержащих 5 команд и начинающих свою работу из 23. При этом исполнитель не может совершать ходы, которые приводят его в числа кратные 5. Например, из числа 7 можно попасть только в 9 и 56.

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

Решение 1 (Рекурсия)

def f(st, count, end_count):
    global A # объявляем А глобальной переменной, чтобы добавлять туда
#новые элементы из функции
    if count == end_count:
        A.add(st)
    else:
        if (st + st ** 2) % 5 != 0:
            f(st + st ** 2, count + 1, end_count)
        if (st - 12) % 5 != 0:
            f(st - 12, count + 1, end_count)
        if st >= 0:
            if (st + int(st ** 0.5)) % 5 != 0:
                f(st + int(st ** 0.5), count + 1, end_count)
A = set()
f(23, 0, 5)
print(len(A))

Решение 2 (Динамика)

ans = set()
ans.add(23)
for operations in range(5):
    can_get = set()
    for i in ans:
        if (i + i ** 2) % 5 != 0:
            can_get.add(i + i ** 2)
        if (i - 12) % 5 != 0:
            can_get.add(i - 12)
        if i >= 0:
            if (i + int(i ** 0.5)) % 5 != 0:
                can_get.add(i + int(i ** 0.5))
    ans = can_get
print(len(ans))

Ответ: 57

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

Задача 3#30483

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

1. Вычесть 10

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

3. Модуль числа

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

Сколько существует различных результатов выполнения программ, содержащих 10 команд и начинающих свою работу из 1. При этом исполнитель не может совершать ходы, которые не изменяют знак числа. Например, из числа 1 нельзя попасть в число 1, но можно в -9 и в -2.

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

Решение 1 (Рекурсия)

def f(st, count, end_count):
    global A
    if count == end_count:
        A.add(st)
    else:
        if st > 0:
            f(st * (-2), count + 1, end_count)
            if st < 10:
                f(st - 10, count + 1, end_count)
        if st < 0:
            f(st * (-1), count + 1, end_count)
            f(st * (-2), count + 1, end_count)


A = set()  # Лучший вариант для данной задачи,
# в множестве не повторяются элементы
f(1, 0, 10)
print(len(A))

Решение 2 (Динамика)

ans = set()
ans.add(1)
for operations in range(10):
    can_get = set()
    for i in ans:
        if i > 0:
            can_get.add(i * (-2))
            if i - 10 < 0:
                can_get.add(i - 10)
        else:
            can_get.add(abs(i))
            can_get.add(i * (-2))
    ans = can_get
print(len(ans))

Ответ: 28

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

Задача 4#30482

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

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

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

3. Прибавить 4

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

Сколько существует различных результатов выполнения программ, содержащих 8 команд и начинающих свою работу из 2.

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

Решение 1 (Рекурсия)

def f(st, count, end_count):
    global A # объявляем А глобальной переменной,
    # чтобы добавлять туда новые элементы внутри функции
    if count == end_count:
        A.add(st)
    else:
        f(st + 1, count + 1, end_count)
        f(st * 2, count + 1, end_count)
        f(st + 4, count + 1, end_count)
A = set() # Лучший вариант для данной задачи, так как в множестве
# не повторяются элементы
f(2, 0, 8)
print(len(A))

Решение 2 (Динамика)

ans = set()
ans.add(2)
for operations in range(8):
    can_get = set()
    for i in ans:
        can_get.add(i + 1)
        can_get.add(i * 2)
        can_get.add(i + 4)
    ans = can_get
print(len(ans))

Ответ: 189

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

Задача 5#28819

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

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

  2. Умножить на 2  и прибавить 1

Первая команда увеличивает число на экране на 2,  вторая — увеличивает число в 2  раза и добавляет 1.  Программа для исполнителя — это последовательность команд.

Сколько различных результатов можно получить из исходного числа 6  после выполнения программы, содержащей ровно 12  команд?

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

Решение 1 (Рекурсия)

ans = set()
def f(start, com):
    global ans
    if com == 0:
        ans.add(start)
        return 0
    f(start + 2, com - 1)
    f(start * 2 + 1, com - 1)
f(6, 12)
print(len(ans))

Решение 2 (Динамика)

ans = set()
ans.add(6)
for cnt in range(12):
    can_get = set()
    for i in ans:
        can_get.add(i + 2)
        can_get.add(i * 2 + 1)
    ans = can_get
print(len(ans))

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