Тема 19. Теория игр

19.02 Перекладывание камней две кучи

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

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

Задача 61#61323Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч четыре камня или увеличить количество камней в куче в три раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.

Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 88. Победителем считается игрок, сделавший последний ход, т. е. первым получивший такую позицию, при которой в кучах будет 88 или больше камней.

В начальный момент в первой куче было 8 камней, во второй куче — S камней; 1 ≤ S ≤ 79  .

Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры.
    if first_heap + second_heap >= 88:  # Если сумма камней в кучах стала больше 87
        return 0  # Прекращаем игру
    moves = [game(first_heap, second_heap+4), game(first_heap+4, second_heap),
             game(first_heap * 3, second_heap),game(first_heap, second_heap * 3)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,80):
    # если в данной позиции после неудачного хода Пети возможен выигрыш Вани
    if game(8+4,i) == 1 or game(8,i+4) == 1 or game(8*3,i) == 1 or game(8,i*3) == 1:
        print(i)
        break

Ответ: 9

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

Задача 62#61326Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в меньшую кучу семь камней или умножить количество камней в этой куче на два. Изменять количество камней в большей куче не разрешается. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.

Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 70. Победителем считается игрок, сделавший последний ход, т. е. первым получивший такую позицию, при которой в кучах будет 70 или больше камней.

В начальный момент в первой куче было 11 камней, во второй куче — S камней; 1 ≤ S ≤ 58  .

Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры.
    if first_heap + second_heap >= 70:  # Если сумма камней в кучах стала больше 69
        return 0  # Прекращаем игру
    moves = []  # Список всех возможных ходов
    if first_heap > second_heap: # если камней в первой куче больше чем во второй
        # то добавляем камни только во вторую кучу
        moves = [game(first_heap,second_heap+7),game(first_heap,second_heap*2)] # Генерация ходов
    else: # иначе если во второй куче камней больше чем в первой или количество камней в кучах равно
        # то добавляем камни только во первую кучу
        moves = [game(first_heap+ 7, second_heap ), game(first_heap*2, second_heap )] # Генерация ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,59):
    if 11 > i:
        # если в данной ситуации после неудачного хода Пети возможен выигрыш Вани
        if game(11,i+7) == 1 or game(11,i*2) == 1:
            print(i)
            break
    else:
        # если в данной ситуации после неудачного хода Пети возможен выигрыш Вани
        if game(11+7,i) == 1 or game(11*2,i) == 1:
            print(i)
            break

Ответ: 26

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

Задача 63#61329Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч два камня или увеличить количество камней в куче в два раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.

Игра завершается в тот момент, когда количество камней в кучах становится не менее 40. Если при этом в кучах осталось не более 58 камней, то победителем считается игрок, сделавший последний ход. В противном случае победителем становится его противник.

В начальный момент в первой куче было 8 камней, во второй куче — S камней; 1 ≤ S ≤ 31  .

Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры.
    if first_heap + second_heap > 58: # Если значение камней больше 58
        return -10**5 # Возвращаем крайне маленькое значение
    if first_heap + second_heap >= 40:  # Если сумма камней в кучах стала больше 39
        return 0  # Прекращаем игру
    moves = [game(first_heap, second_heap+2), game(first_heap+2, second_heap),
             game(first_heap * 2, second_heap),game(first_heap, second_heap * 2)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,32):
    # если в данной позиции после неудачного хода Пети возможен выигрыш Вани
    if game(8+2,i) == 1 or game(8*2,i) == 1 or game(8,i+2) == 1 or game(8,i*2) == 1:
        print(i)
        break

Ответ: 8

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

Задача 64#61332Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч пять камней или увеличить количество камней в куче в четыре раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.

Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 111. Победителем считается игрок, сделавший последний ход, т. е. первым получивший такую позицию, при которой в кучах будет 111 или больше камней.

В начальный момент в первой куче было 12 камней, во второй куче — S камней; 1 ≤ S ≤ 98  .

Известно, что Петя смог выиграть первым ходом.

Какое наименьшее число камней могло быть суммарно в двух кучах?

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры.
    if first_heap + second_heap >= 111:  # Если сумма камней в кучах стала больше 110
        return 0  # Прекращаем игру
    moves = [game(first_heap, second_heap+5), game(first_heap+5, second_heap),
             game(first_heap * 4, second_heap),game(first_heap, second_heap * 4)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,99):
    # если в данной позиции возможен выигрыш Пети первым ходом
    if game(12,i) == 1:
        print(i+12)
        break

Ответ: 37

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

Задача 65#61635Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень или увеличить количество камней в куче в три раза. Например, пусть в одной куче 8 камней, а в другой 10 камней; такую позицию мы будем обозначать (8, 10) За один ход из позиции (8,10) можно получить любую из четырех позиций: (9, 10), (27, 10), (8, 11), (8, 30). Чтобы делать ходы, у каждого игрока есть неограниченное количество камней.

Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 75. Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах будет 75 или больше камней.

В начальный момент в первой куче было 7 камней, во второй куче S камней, 1 ≤ S ≤ 67  .

Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Описать стратегию игрока значит описать, какой ход он должен сделать в любой ситуации, которая ему может встретиться при различной игре противника. В описание выигрышной стратегии не следует включать ходы играющего по этой стратегии игрока, не являющиеся для него безусловно выигрышными, т.е. не являющиеся выигрышными независимо от игры противника.

Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры.
    if first_heap + second_heap >= 75:  # Если сумма камней в кучах стала больше 74
        return 0  # Прекращаем игру
    moves = [game(first_heap, second_heap+1), game(first_heap+1, second_heap),
             game(first_heap * 3, second_heap),game(first_heap, second_heap * 3)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,68):
    # если в данной позиции после неудачного хода Пети возможен выигрыш Вани
    if game(7+1,i) == 1 or game(7,i+1) == 1 or game(7*3,i) == 1 or game(7,i*3) == 1:
        print(i)
        break

Ответ: 8

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

Задача 66#63369Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может в одну из куч (по своему выбору) добавить один камень или увеличить количество камней в куче в два раза. Например, пусть в одной куче 10 камней, а в другой 5 камней; такую позицию в игре будем обозначать (10, 5). Тогда за один ход можно получить любую из четырёх позиций: (11, 5), (20, 5), (10, 6), (10, 10). Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.

Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 73. Победителем считается игрок, сделавший последний ход, т.е. первым получивший такую позицию, при которой в кучах будет 73 или больше камней. В начальный момент в первой куче было одиннадцать камней, во второй куче — S камней; 1 ≤ S    ≤ 61.

Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры.
    if first_heap + second_heap >= 73:  # Если сумма камней в кучах стала больше 72
        return 0  # Прекращаем игру
    moves = [game(first_heap, second_heap+1), game(first_heap+1, second_heap),
             game(first_heap * 2, second_heap),game(first_heap, second_heap * 2)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,62):
    # если в данной позиции после неудачного хода Пети возможен выигрыш Вани
    if game(11+1,i) == 1 or game(11,i+1) == 1 or game(11*2,i) == 1 or game(11,i*2) == 1:
        print(i)
        break

Ответ: 16

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

Задача 67#63372Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в любую кучу один камень или увеличить количество камней в любой куче в четыре раза.

Игра завершается в тот момент, когда суммарное количество камней в двух кучах становится не менее 105, побеждает игрок, сделавший последний ход. В начальный момент в первой куче было 4 камня, а во второй - S камней, 1 ≤ S ≤ 100.

Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Назовите минимальное значение S, при котором это возможно.

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры.
    if first_heap + second_heap >= 105:  # Если сумма камней в кучах стала больше 104
        return 0  # Прекращаем игру
    moves = [game(first_heap, second_heap+1), game(first_heap+1, second_heap),
             game(first_heap * 4, second_heap),game(first_heap, second_heap * 4)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,101):
    # если в данной позиции после неудачного хода Пети возможен выигрыш Вани
    if game(4+1,i) == 1 or game(4,i+1) == 1 or game(4*4,i) == 1 or game(4,i*4) == 1:
        print(i)
        break

Ответ: 7

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

Задача 68#63375Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в любую кучу один камень или увеличить количество камней в любой куче в четыре раза.

Игра завершается в тот момент, когда общее количество камней в двух кучах становится не менее 108. Победителем считается игрок, сделавший последний ход. В начальный момент в первой куче было 6 камней, а во второй – S камней, 1 ≤ S ≤ 101.

Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Назовите минимальное значение S, при котором это возможно.

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры.
    if first_heap + second_heap >= 108:  # Если сумма камней в кучах стала больше 107
        return 0  # Прекращаем игру
    moves = [game(first_heap, second_heap+1), game(first_heap+1, second_heap),
             game(first_heap * 4, second_heap),game(first_heap, second_heap * 4)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,102):
    # если в данной позиции после неудачного хода Пети возможен выигрыш Вани
    if game(6+1,i) == 1 or game(6,i+1) == 1 or game(6,i) == 1 or game(6,i*4) == 1:
        print(i)
        break

Ответ: 7

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

Задача 69#63378Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч три камня или увеличить количество камней в куче в два раза. Чтобы делать ходы, у каждого игрока есть неограниченное количество камней.

Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 78. Победителем считается игрок, сделавший последний ход, т. е. первым получивший позицию, в которой в кучах будет 78 или больше камней. В начальный момент в первой куче было 7 камней, во второй куче – S камней, 1 ≤ S ≤ 70. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.

Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Назовите минимальное значение S, при котором это возможно.

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры.
    if first_heap + second_heap >= 78:  # Если сумма камней в кучах стала больше 77
        return 0  # Прекращаем игру
    moves = [game(first_heap, second_heap+3), game(first_heap+3, second_heap),
             game(first_heap * 2, second_heap),game(first_heap, second_heap * 2)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,71):
    # если в данной позиции после неудачного хода Пети возможен выигрыш Вани
    if game(7+3,i) == 1 or game(7,i+3) == 1 or game(7*2,i) == 1 or game(7,i*2) == 1:
        print(i)
        break

Ответ: 18

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

Задача 70#63535Максимум баллов за задание: 1

Два игрока Петя и Ваня играют в следующую игру. Перед игроками лежат две кучи камней, Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень или увеличить количество камней в 4 раза. Чтобы делать ходы, у каждого игрока есть неограниченное количество камней.Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 82. Победителем считается игрок, сделавший последний ход, то есть первым получивший позицию, в которой в кучах будет 82 или больше камней. В начальный момент в первой куче было 4 камня, во второй куче — S камней, 1 ≤ S ≤ 77  .

Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры.
    if first_heap + second_heap >= 82:  # Если сумма камней в кучах стала больше 81
        return 0  # Прекращаем игру
    moves = [game(first_heap, second_heap+1), game(first_heap+1, second_heap),
             game(first_heap * 4, second_heap),game(first_heap, second_heap * 4)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,78):
    # если в данной позиции после неудачного хода Пети возможен выигрыш Вани
    if game(4+1,i) == 1 or game(4,i+1) == 1 or game(4*4,i) == 1 or game(4,i*4) == 1:
        print(i)
        break

Ответ: 5

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

Задача 71#63838Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч три камня или увеличить количество камней в куче в два раза. Чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 79. Победителем считается игрок, сделавший последний ход, т. е. первым получивший позицию, в которой в кучах будет 79 или больше камней. В начальный момент в первой куче было 9 камней, во второй куче – S камней, 1 ≤ S ≤ 69  . Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.

Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Назовите минимальное значение S, при котором это возможно.

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры.
    if first_heap + second_heap >= 79:  # Если сумма камней в кучах стала больше 78
        return 0  # Прекращаем игру
    moves = [game(first_heap, second_heap+3), game(first_heap+3, second_heap),
             game(first_heap * 2, second_heap),game(first_heap, second_heap * 2)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,70):
    # если в данной позиции после неудачного хода Пети возможен выигрыш Вани
    if game(9+3,i) == 1 or game(9,i+3) == 1 or game(9*2,i) == 1 or game(9,i*2) == 1:
        print(i)
        break

Ответ: 18

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

Задача 72#63928Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч один камень или увеличить количество камней в куче в три раза. Чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 49. Победителем считается игрок, сделавший последний ход, т. е. первым получивший позицию, в которой в кучах будет 49 или больше камней.

В начальный момент в первой куче было 5 камней, во второй куче - S камней, 1 < S < 43. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.

Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Назовите минимальное значение S, при котором это возможно.

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

Решение руками

Минимальное значение во второй куче, при котором игра завершается — 49-5=44. Максимальный ход, который мы имеем в игре — *3, следовательно, промежуток, при котором игрок побеждает одним ходом, располагается от 15 до 44.

Умножаем 15 на 3, получаем 45. Для того, чтобы оказаться в выигрышной позиции, нам нужно, чтобы значение камней во второй куче было равно минимум 49-45=4. Ответ — 4.

Решение с помощью программы

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры.
    if first_heap + second_heap >= 49:  # Если сумма камней в кучах стала больше 48
        return 0  # Прекращаем игру
    moves = [game(first_heap, second_heap+1), game(first_heap+1, second_heap),
             game(first_heap * 3, second_heap),game(first_heap, second_heap * 3)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,44):
    # если в данной позиции после неудачного хода Пети возможен выигрыш Вани
    if game(5+1,i) == 1 or game(5,i+1) == 1 or game(5*3,i) == 1 or game(5,i*3) == 1:
        print(i)
        break

Ответ: 4

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

Задача 73#71626Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Ваня. За один ход игрок может добавить в одну из куч (по своему выбору) пять камней или увеличить количество камней в одной из куч в два раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.

Игра завершается в тот момент, когда суммарное количество камней в двух кучах становится не менее 140. Победителем считается игрок, сделавший последний ход, то есть первым получивший такую позицию, при которой в обеих кучах в сумме стало 140 или больше камней.

В начальный момент в первой куче было 25 камней, во второй куче – S камней; 1 ≤ S ≤ 99.

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

Найдите сумму значений S, при котором у Пети есть выигрышная стратегия, при которой он побеждает своим первым ходом.

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap,count_moves = 0):  # Функция игры.
    # count_moves - это счётчик ходов в партии.
    # Он добавлен для ускорения выполнения программы за счёт того, что продолжительные партии будут обрываться.
    # Если в партии совершено слишком много ходов, то данная партия нам неинтересна и нам не важно кто в ней победит.
    if first_heap + second_heap >= 140:  # Если сумма камней в кучах стала больше 139
        return 0  # Прекращаем игру
    if count_moves > 5: # Если в партии совершено слишком много ходов
        return 10**5 # Прерываем игру, возвращая очень большое значение
    moves = [game(first_heap, second_heap+5,count_moves+1), game(first_heap+5, second_heap,count_moves+1),
             game(first_heap * 2, second_heap,count_moves+1),game(first_heap, second_heap * 2,count_moves+1)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)
sm = 0
for i in range(1,100):
    # если в данной позиции возможен выигрыш Пети первым ходом
    if game(25,i) == -1:
        sm += i
print(sm)

Ответ: 168

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

Задача 74#71629Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) два или три камня или увеличить количество камней в одной из куч на количество камней в другой куче. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.

Игра завершается в тот момент, когда суммарное количество камней в двух кучах становится не менее 98. Победителем считается игрок, сделавший последний ход, то есть первым получивший такую позицию, при которой в обеих кучах в сумме стало 98 или больше камней.

В начальный момент в первой куче было 10 камней, во второй куче – S камней; 1 ≤ S ≤ 78.

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

Найдите значение S, при котором у Вани есть выигрышная стратегия, при которой он побеждает своим первым ходом.

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap,count_moves = 0):  # Функция игры.
    # count_moves - это счётчик ходов в партии.
    # Он добавлен для ускорения выполнения программы за счёт того, что продолжительные партии будут обрываться.
    # Если в партии совершено слишком много ходов, то данная партия нам неинтересна и нам не важно кто в ней победит.
    if first_heap + second_heap >= 98:  # Если сумма камней в кучах стала больше 97
        return 0  # Прекращаем игру
    if count_moves > 5: # Если в партии совершено слишком много ходов
        return 10**5 # Прерываем игру, возвращая очень большое значение
    moves = [game(first_heap, second_heap+2,count_moves+1), game(first_heap+2, second_heap,count_moves+1),
             game(first_heap + 3, second_heap,count_moves+1),game(first_heap, second_heap +3,count_moves+1),
             game(first_heap + second_heap, second_heap,count_moves+1),game(first_heap, second_heap + first_heap,count_moves+1)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,79):
    # если в данной позиции возможен выигрыш Вани первым ходом
    if game(10,i) == -1:
        print(i)

Ответ: 43

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

Задача 75#71632Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Ваня. За один ход игрок может добавить в одну из куч (по своему выбору) десять камней, увеличить количество камней в одной из куч в два или четыре раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.

Игра завершается в тот момент, когда суммарное количество камней в двух кучах становится не менее 260. Победителем считается игрок, сделавший последний ход, то есть первым получивший такую позицию, при которой в обеих кучах в сумме стало 260 или больше камней.

В начальный момент в первой куче было 44 камня, во второй куче – S камней; 1 ≤ S ≤ 188.

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

Найдите минимальное значение S, при котором у Вани есть выигрышная стратегия, при которой он побеждает своим первым ходом.

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap,count_moves = 0):  # Функция игры.
    # count_moves - это счётчик ходов в партии.
    # Он добавлен для ускорения выполнения программы за счёт того, что продолжительные партии будут обрываться.
    # Если в партии совершено слишком много ходов, то данная партия нам неинтересна и нам не важно кто в ней победит.
    if first_heap + second_heap >= 260:  # Если сумма камней в кучах стала больше 259
        return 0  # Прекращаем игру
    if count_moves > 6: # Если в партии совершено слишком много ходов
        return 10**5 # Прерываем игру, возвращая очень большое значение
    moves = [game(first_heap, second_heap+10,count_moves+1), game(first_heap+10, second_heap,count_moves+1),
             game(first_heap * 2, second_heap,count_moves+1),game(first_heap, second_heap * 2,count_moves+1),
             game(first_heap * 4, second_heap,count_moves+1),game(first_heap, second_heap * 4,count_moves+1)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,189):
    # если в данной позиции возможен выигрыш Вани первым ходом
    if game(44,i) == 1:
        print(i)
        break

Ответ: 54

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

Задача 76#71635Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в меньшую из куч количество камней в другой куче или в меньшей из куч возвести количество камней в квадрат. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.

Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 190. Победителем считается игрок, сделавший последний ход, то есть первым получивший такую позицию, при которой в кучах будет 190 или больше камней.

В начальный момент в первой куче было 5 камня, во второй куче – S камней; 1 ≤ S ≤ 88. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.

Найдите минимальное значение S, при котором у Вани есть выигрышная стратегия, при которой он побеждает своим первым ходом.

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap,count_moves = 0):  # Функция игры.
    # count_moves - это счётчик ходов в партии.
    # Он добавлен для ускорения выполнения программы за счёт того, что продолжительные партии будут обрываться.
    # Если в партии совершено слишком много ходов, то данная партия нам неинтересна и нам не важно кто в ней победит.
    if first_heap + second_heap >= 190:  # Если сумма камней в кучах стала больше 189
        return 0  # Прекращаем игру
    if count_moves > 6: # Если в партии совершено слишком много ходов
        return 10**5 # Прерываем игру, возвращая очень большое значение
    moves = []  # Список всех возможных ходов
    if first_heap > second_heap: # если камней в первой куче больше чем во второй
        # то добавляем камни только во вторую кучу
        moves = [game(first_heap,second_heap+first_heap,count_moves+1),game(first_heap,second_heap**2,count_moves+1)] # Генерация ходов
    else: # иначе если во второй куче камней больше чем в первой или количество камней в кучах равно
        # то добавляем камни только в первую кучу
        moves = [game(first_heap+ second_heap, second_heap,count_moves+1 ), game(first_heap**2, second_heap,count_moves+1)] # Генерация ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,89):
    # если в данной позиции возможен выигрыш Вани первым ходом
    if game(5,i) == -1:
        print(i)
        break

Ответ: 14

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

Задача 77#71638Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) 5 камней или возвести количество камней в куче в квадрат. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней.

Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 210. Победителем считается игрок, сделавший последний ход, то есть первым получивший такую позицию, при которой в кучах будет 210 или больше камней.

В начальный момент в первой куче было 3 камня, во второй куче – S камней; 1 ≤ S ≤ 204. Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.

Найдите минимальное значение S, при котором у Пети есть выигрышная стратегия, при которой он побеждает своим первым ходом.

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap,count_moves = 0):  # Функция игры.
    # count_moves - это счётчик ходов в партии.
    # Он добавлен для ускорения выполнения программы за счёт того, что продолжительные партии будут обрываться.
    # Если в партии совершено слишком много ходов, то данная партия нам неинтересна и нам не важно кто в ней победит.
    if first_heap + second_heap >= 210:  # Если сумма камней в кучах стала больше 209
        return 0  # Прекращаем игру
    if count_moves > 6: # Если в партии совершено слишком много ходов
        return 10**5 # Прерываем игру, возвращая очень большое значение
    moves = [game(first_heap, second_heap+5,count_moves+1), game(first_heap+5, second_heap,count_moves+1),
             game(first_heap ** 2, second_heap,count_moves+1),game(first_heap, second_heap ** 2,count_moves+1)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,205):
    # если в данной позиции возможен выигрыш Пети первым ходом
    if game(3,i) == 1:
        print(i)
        break

Ответ: 15

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

Задача 78#72420Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче в два раза. Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 60. Победителем считается игрок, сделавший последний ход, т.е. первым получивший такую позицию, при которой в кучах будет 60 или больше камней. В начальный момент в первой куче было 10 камней, во второй куче – S камней; 1 ≤ S ≤ 49  .

Укажите количество значений S, при которых Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры.
    if first_heap + second_heap >= 60:  # Если сумма камней в кучах стала больше 59
        return 0  # Прекращаем игру
    moves = [game(first_heap, second_heap+1), game(first_heap+1, second_heap),
             game(first_heap * 2, second_heap),game(first_heap, second_heap * 2)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)
count = 0
for i in range(1,50):
    # если в данной позиции возможен выигрыш Вани первым ходом
    if game(10,i) == -1:
        count += 1
print(count)

Ответ: 0

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

Задача 79#72442Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в одну из куч (по своему выбору) один камень или увеличить количество камней в куче в три раза. Игра завершается в тот момент, когда суммарное количество камней в кучах становится не менее 122. Победителем считается игрок, сделавший последний ход, т.е. первым получивший такую позицию, при которой в кучах будет 122 или больше камней. В начальный момент в первой куче было 7 камней, во второй куче – S камней; 1 ≤ S ≤ 114  .

Укажите такое значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры.
    if first_heap + second_heap >= 122:  # Если сумма камней в кучах стала больше 121
        return 0  # Прекращаем игру
    moves = [game(first_heap, second_heap+1), game(first_heap+1, second_heap),
             game(first_heap * 3, second_heap),game(first_heap, second_heap * 3)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)

for i in range(1,115):
    # если в данной позиции возможен выигрыш Вани первым ходом
    if game(7,i) == -1:
        print(i)

Ответ: 38

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

Задача 80#76991Максимум баллов за задание: 1

Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в любую кучу два камня или увеличить количество камней в любой куче в три раза. Игра завершается в тот момент, когда сумма камней в кучах становится не менее 50. В начальный момент в первой куче было S камней, а во второй – P камней, 1 ≤ S ≤ 39,1 ≤ P ≤ 39  .

Сколько существует пар (S; P), таких что Ваня выигрывает первым ходом при любой игре Пети?

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

Программное решение

from functools import lru_cache
@lru_cache(None)
def game(first_heap, second_heap):  # Функция игры.
    if first_heap + second_heap >= 50:  # Если сумма камней в кучах стала больше 49
        return 0  # Прекращаем игру
    moves = [game(first_heap, second_heap+2), game(first_heap+2, second_heap),
             game(first_heap * 3, second_heap),game(first_heap, second_heap * 3)]  # Генерация всех возможных ходов
    petya_win = [i for i in moves if i <= 0]
    if petya_win: # если в данной позиции есть выигрыш Пети
        return -max(petya_win) + 1
    else: # если в данной позиции выигрыш Вани
        return -max(moves)
count = 0
for i in range(1,40):
    for j in range(1,40):
        # если в данной позиции возможен выигрыш Вани первым ходом
        if game(i,j) == -1:
            count += 1
print(count)

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