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

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

Задача 1#30492

У исполнителя Щелчок есть куча камней, но он очень одинок, с ним никто не играет в камушки, поэтому он придумал игру для себя сам. У исполнителя есть 3 команды:

1. Прибавить 3 камушка в кучу

2. Умножить количество камушков в куче на 2 и вычесть 1

3. Если количество камней в куче больше 9, то реверсировать количество камней в куче и прибавить 1 (10 → 2 , 123 → 322)

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

Какое минимальное количество команд содержит программа, которая проходит через 8 различных простых чисел. Исполнитель начинает с числа 2 (первое число тоже считается, если оно простое)

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

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

def is_prime(n):
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return n > 1


def f(st, count_operation, set_prime):
    global count
    if count_operation > count:
        return  # выход из программы без действий
    if is_prime(st):
        set_prime.add(st)
    if len(set_prime) == 8:
        count = min(count, count_operation)
        return
    f(st + 3, count_operation + 1, set_prime.copy())
    f(st * 2 - 1, count_operation + 1, set_prime.copy())
    if st > 9:
        f(int(str(st)[::-1]) + 1, count_operation + 1, set_prime.copy())


count = 10000000000
f(2, 0, set())
print(count)

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

def is_prime(n):
    if n < 2:
        return 0
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return 0
    return 1


primes = [0] * 100000
# для начала определим для каждого числа от 1 до 99999
# простое оно, или нет
for i in range(2, 100000):
    if is_prime(i):
        primes[i] = 1
# далее реализуем динамическое решение задачи
ans = []
ans.append((2, 1))
otv, flag = 100000000, 0

for operations in range(1000):
    can_get = []
    for i in ans:
        a, pr = i
        if pr == 8:
            otv = operations
            flag = 1
            break
        can_get.append((a + 3, pr + primes[a + 3]))
        can_get.append((a * 2 - 1, pr + primes[a * 2 - 1]))
        if a > 9:
            s = str(a)
            s = s[::-1]
            new_num = int(s) + 1
            can_get.append((new_num, pr + primes[new_num]))
    if flag:
        break
    ans = can_get
                                                                                                     
                                                                                                     
print(otv)

Ответ: 10

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

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

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

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

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

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

Бесплатное обучение
в Школково

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

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

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

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

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

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

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

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