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

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

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

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

Задача 1#38805

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

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

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

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

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

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

Для начала определим значения, при которых Петя побеждает первым ходом. Максимальный ход доступный нам в партии это ∗3  . Минимальное значение отрезка значений, в которых Петя побеждает первым ходом равняется: 50 = 16,66..
 3  (округляем в большую сторону) = 17

Получается, что в отрезке [17;49] Петя выигрывает своим первым ходом. Теперь определим значение, в котором Ваня побеждает своим первым ходом. Значение, из которого ВСЕ ходы ведут в вышеописанный отрезок – это значение, в котором Ваня выигрывает своим первым ходом. Распишем значение и стратегии, при которых Ваня побеждает первым ходом:

S = 16  . Петя может увеличить количество камней до 17  , 18  или 48  камней. Во всех этих случаях Ване не составит труда завершить партию следующим ходом.

Ответ: 16

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 50: # если камней в куче стало больше 49
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap+2),game(first_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,50):
    if game(i) == -1: # если в данной позиции возможен выигрыш Вани первым ходом
        print(i)
        break

Решение АР

from functools import lru_cache

def moves(h):
    return h + 1, h + 2, h * 3

@lru_cache(None)
def f(h):
    if (h >= 50):
        return ’END’
    if any(f(x) == ’END’ for x in moves(h)):
        return ’P1’
    if all(f(x) == ’P1’ for x in moves(h)):
        return ’V1’

for s in range(1,50):
    if f(s) == ’V1’:
        print(s)

Ответ: 16

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

Задача 2#49383

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

Игра завершается в тот момент, когда количество камней в куче становится не менее 83.

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

В начальный момент в куче было S  камней; 6 ≤ S ≤ 80  .

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

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

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

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

Максимальный ход доступный нам в партии это ∗4  . Минимальное значение отрезка значений, в которых Петя побеждает первым ходом равняется: 83
-- = 20,75
 4  (округляем в большую сторону) = 21

Получается, что в отрезке [21;82] Петя выигрывает своим первым ходом.

Ответ: 21

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 83: # если камней в куче стало больше 82
        return 0 # прекращаем игру
    moves = [game(first_heap+2),game(first_heap+3),game(first_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(6,81):
    if game(i) == 1: # если в данной позиции возможен выигрыш Петя первым ходом
        print(i)
        break

Ответ: 21

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

Задача 3#16207

Два игрока, Оливье и Крабовый, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Оливье. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в 2  раза. Например, имея кучу из 10  камней, за один ход можно получить кучу из 11  или 20  камней. Чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в куче становится не менее 33  .

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

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

Найдите такое значение S  , при котором Крабовый выигрывает своим первым ходом при любой игре Оливье.

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

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

Найдем такие S  , при которых Оливье может выиграть своим первым ходом. Должно выполняться неравенство: 2 ⋅S ≥ 33  . То есть Оливье может выиграть при S ≥ 17  . Таким образом, если мы возьмем S = 16  то Оливье никак не сможет выиграть первым ходом, но при этом любым своим ходом он создаст выигрышную позицию для Крабового, и тогда Крабовый уже гарантированно победит своим первым ходом.

Решение БУ

#Петя - Оливье
#Ваня - Крабовый
def game(first_heap): # функция игры
    if first_heap >= 33: # если камней в куче стало больше 32
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_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,33):
    if game(i) == -1: # если в данной позиции Ваня побеждает первым ходом
        print(i)
        break

Решение АР

from functools import lru_cache


def moves(h):
    return h + 1, h * 2


@lru_cache(None)
def f(h):
    if h >= 33:
        return ’END’
    if any(f(x) == ’END’ for x in moves(h)):
        return ’WIN1’
    if all(f(x) == ’WIN1’ for x in moves(h)):
        return ’LOSE1’


for i in range(1, 33):
    if f(i) == ’LOSE1’:
        print(i)

Ответ: 16

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

Задача 4#16210

Два игрока, Оливье и Крабовый, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Оливье. За один ход игрок может добавить в кучу один камень или добавить в кучу три камня или увеличить количество камней в куче в 2  раза. Например, имея кучу из 10  камней, за один ход можно получить кучу из 11  или 13  или 20  камней. Чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в куче становится не менее 42  .

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

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

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

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

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

Чтобы Крабовый победил своим первым ходом, Оливье должен увеличить количество камней в куче на столько, чтобы следующим ходом Крабовый мог победить. Эффективнее Оливье и Крабовому будет удваивать S  , чем добавлять к нему 1  или 3  . При каких S  будет выполняться 2⋅2 ⋅S >=  42?  При S ≥ 11  . Следовательно ответ 11  .

Решение БУ

#Петя - Оливье
#Ваня - Крабовый
from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 42: # если камней в куче стало больше 41
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap*2),game(first_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,42):
    if game(i+1) == 1 or game(i+3) == 1 or game(i*2) == 1: # если после неудачного хода Пети возможен выигрыш Вани в один ход
        print(i)
        break

Решение АР

from functools import lru_cache


def moves(h):
    return h + 1, h + 3, h * 2


@lru_cache(None)
def f(h):
    if h >= 42:
        return ’END’
    if any(f(x) == ’END’ for x in moves(h)):
        return ’WIN1’
    if any(f(x) == ’WIN1’ for x in moves(h)):
        return ’LOSE1’


for i in range(1, 42):
    if f(i) == ’LOSE1’:
        print(i)
        break

Ответ: 11

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

Задача 5#16213

Два игрока, Оливье и Крабовый, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Оливье. За один ход игрок может убрать из кучи один камень или убрать из кучи два камня. Например, имея кучу из 10  камней, за один ход можно получить кучу из 9  или 8  камней. Чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в куче становится не более 34  .

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

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

Найдите такое значение S  , при котором Крабовый выигрывает своим первым ходом при любой игре Оливье.

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

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

Найдем такие S  , при которых Оливье может выиграть своим первым ходом. Должно выполняться неравенство: S − 2 ≤ 34  . То есть Оливье может выиграть при S ≤ 36  . Таким образом, если мы возьмем S = 37  то Оливье никак не сможет выиграть первым ходом, но при этом любым своим ходом он создаст выигрышную позицию для Крабового, и тогда Крабовый уже гарантированно победит своим первым ходом.

Решение БУ

#Петя - Оливье
#Ваня - Крабовый

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap <= 34: # если камней в куче стало меньше 34
        return 0 # прекращаем игру
    moves = [game(first_heap-1),game(first_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(36,100):
    if game(i) == -1: # если в данной позиции Ваня побеждает первым ходом
        print(i)

Решение АР

from functools import lru_cache


def moves(h):
    return h - 1, h - 2


@lru_cache(None)
def f(h):
    if h <= 34:
        return ’END’
    if any(f(x) == ’END’ for x in moves(h)):
        return ’WIN1’
    if all(f(x) == ’WIN1’ for x in moves(h)):
        return ’LOSE1’


for i in range(36, 100):
    if f(i) == ’LOSE1’:
        print(i)

Ответ: 37

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

Задача 6#19036

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

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

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

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

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

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

Максимальный ход, доступный нам в партии это ∗ 3  . Определим минимальное значение S, при котором Петя может выиграть своим первым ходом: 63
--= 21
3

Решение БУ


from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 63: # если камней в куче стало больше 62
        return 0 # прекращаем игру
    moves = [game(first_heap+2),game(first_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,63):
    if game(i) == 1: # если в данной позиции Петя побеждает первым ходом
        print(i)
        break

Ответ: 21

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

Задача 7#19039

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

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

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

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

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

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

Для начала определим отрезок значений, в которых Петя побеждает своим первым ходом. Максимальный ход, доступный в партии это ∗ 2  . Минимальное значение отрезка равно: 62
--= 31
2  Получается, что в отрезке значений [31;61] Петя гарантированно побеждает своим первым ходом. Значение, из которого ВСЕ первые ходы ведут в вышеописанный отрезок – это значение, где Ваня гарантированно побеждает своим первым ходом. Распишем значение и стратегии, при которых Ваня побеждает своим первым ходом:

S = 30  . Петя может увеличить количество камней до 31  , 33  или 60  . Ваня не составит труда следующим ходом завершить игру.

Ответ: 30

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 62: # если камней в куче стало больше 61
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap+3),game(first_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(i) == -1: # если в данной позиции Ваня побеждает первым ходом
        print(i)
        break

Ответ: 30

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

Задача 8#19192

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

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

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

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

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

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

Максимальный ход, доступный нам в партии это ∗ 2  . Минимальное значение, в котором Петя побеждает своим первым ходом равняется: 42
-- = 21
 2

Получается, в отрезке значений [21;41] Петя гарантированно побеждает своим первым ходом.

Ответ: 21

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 42: # если камней в куче стало больше 41
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_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,42):
    if game(i) == 1: # если в данной позиции Петя побеждает первым ходом
        print(i)
        break

Решение АР

from functools import lru_cache

def moves(heap):
    return heap + 1, heap * 2

@lru_cache(None)
def game(heap):
    if heap >= 42:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(heap)):
        return ’P1’
    elif all(game(x) == ’P1’ for x in moves(heap)):
        return ’V1’
    elif any(game(x) == ’V1’ for x in moves(heap)):
        return ’P2’
    elif all(game(x) == ’P1’ or game(x) == ’P2’ for x in moves(heap)):
        return ’V2’

for s in range(1, 42):
    print(s, game(s))

Ответ: 21

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

Задача 9#19195

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

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

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

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

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

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

Для начала определим значения, в которых Петя гарантированно побеждает своим первым ходом. Максимальный ход, доступный в партии это ∗ 3  . Минимальное значение, в котором Петя выигрывает первым ходом равняется: 50
--= 16..
3  (округляем в большую сторону) = 17

Получается, что в отрезке значений [17;49] Петя гарантированно побеждает своим первым ходом. Значение, из которого ВСЕ первые ходы ведут в вышеописанный отрезок – это значение, в котором Ваня гарантированно побеждает своим первым ходом. Распишем значение и стратегии, при которых Ваня побеждает своим первым ходом:

S = 16  . Петя может увеличить количество камней до 17  , 18  или 48  . Во всех этих случаях Ване не составит труда завершить партию следующим ходом.

Ответ: 16

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 50: # если камней в куче стало больше 49
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap+2),game(first_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,50):
    if game(i) == -1: # если в данной позиции Ваня побеждает первым ходом
        print(i)

Решение АР

from functools import lru_cache

def moves(heap):
    return heap + 1, heap + 2, heap * 3

@lru_cache(None)
def game(heap):
    if heap >= 50:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(heap)):
        return ’P1’
    elif all(game(x) == ’P1’ for x in moves(heap)):
        return ’V1’
    elif any(game(x) == ’V1’ for x in moves(heap)):
        return ’P2’
    elif all(game(x) == ’P1’ or game(x) == ’P2’ for x in moves(heap)):
        return ’V2’

for s in range(1, 50):
    print(s, game(s))

Ответ: 16

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

Задача 10#23621

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

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

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

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

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

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

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

Максимальный ход, доступный нам в партии это +10. Значит, в отрезке [61;70] Петя гарантированно побеждает своим первым ходом.

Если S = 61  , то Пете достаточно прибавить к куче 10  камней.

Если S = 70  , то Пете достаточно прибавить к куче 1  камень.

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 71: # если камней в куче стало больше 70
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap+10)] # прописываем ходы возможные в партии
    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(i) == 1: # если в данной позиции Петя побеждает первым ходом
        print(i)

Ответ: 6170

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

Задача 11#23627

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

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

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

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

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

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

Максимальный ход, доступный нам в партии это ∗ 2  . Выигрыш достигается при 39+ камнях, значит, что область, в которой Петя может выиграть начинается с: 39
--= 19,5
2

Округляем в бОльшую сторону и получаем 20  . В отрезке [20;38] Петя побеждает в один ход. Минимальное значение S: 20  .

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 39: # если камней в куче стало больше 38
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap+2),game(first_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,38):
    if game(i) == 1: # если в данной позиции Петя побеждает первым ходом
        print(i)

Ответ: 20

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

Задача 12#23630

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

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

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

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

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

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

Для начала найдем значения S, при которых Петя гарантированно побеждает своим первым ходом. Максимальный ход, доступные в партии это ∗ 3  . Определим минимальное значение, из которого Петя может победить в один ход: 55 = 18,33..
 3  (округляем в большую сторону) = 19  . Значения, после которых мы гарантированно можем попасть в область [19;54] – это значения, в которых Ваня побеждает своим первым ходом. Распишем подробно значение и стратегии, в которых Ваня побеждает своим первым ходом:

При S = 17  Петя может прийти в три позиции: 19  ,21  и 51  . В любых этих позициях Ваня гарантированно побеждает своим первым ходом.

При S = 18  Петя может прийти в три позиции: 20  , 22  и 54  . Так как 20 ⋅3 > 55,  то Ване уже неважно, какой конкретно ход сделает Петя.

В ответ нужно указать максимальное значение S, по этой причине ответ 18  .

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 55: # если камней в куче стало больше 54
        return 0 # прекращаем игру
    moves = [game(first_heap+2),game(first_heap+4),game(first_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,55):
    if game(i) == -1: # если в данной позиции Ваня побеждает первым ходом
        print(i)

Ответ: 18

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

Задача 13#23633

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

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

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

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

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

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

Для того, чтобы получить минимальное значение предположим, что и Петя, и Ваня своим ходом увеличивали количество камней в куче в три раза. Тогда минимальное значение S  равно 8  , т.е. Петя увеличит количество камней до 24  , а Ваня соответственно до 72  , тем самым выиграв.

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 68: # если камней в куче стало больше 67
        return 0 # прекращаем игру
    moves = [game(first_heap+2),game(first_heap+4),game(first_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(i+2) == 1 or game(i+4) == 1 or game(i*3) == 1: # Если в текущей позиции после неудачного хода Пети возможен выигрыш Вани в один ход
        print(i)
        break

Ответ: 8

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

Задача 14#23681

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

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

 

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

 

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

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

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

Чтобы найти минимальное значение, при котором Петя выигрывает за один ход, нужно, чтобы Петя за один ход сделал кучу как можно больше, то есть увеличил количество камней в куче в 3  раза. Поскольку победителем считается игрок, первым получивший позицию, в которой в куче будет минимум 27  камней, а мы знаем, что Петя увеличит количество камней в куче в 3  раза, то чтобы найти минимальное значение, при котором Петя выиграет за один ход, нужно разделить 27  на 3  . Получаем ответ: 9  .

Действительно, возьмем S = 9  , тогда Петя увеличит количество камней в куче в 3  раза и получит 27  камней, то есть выиграет.

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 27: # если камней в куче стало больше 26
        return 0 # прекращаем игру
    moves = [game(first_heap+2),game(first_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,27):
    if game(i) == 1: # если в данной позиции Петя побеждает первым ходом
        print(i)
        break

Решение АР

from functools import lru_cache
def moves(h):
    return (h+2), (h*3)
@lru_cache(None)
def game(h):
    if h >= 27:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(h)):
        return ’WIN1’
for s in range(1, 27):
    if game(s) == ’WIN1’:
        print(s)

Ответ: 9

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

Задача 15#23684

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

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

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

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

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

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

Максимальный ход доступный нам в партии это ∗3  . Минимальное значение S, при котором Петя гарантированно побеждает своим первым ходом равняется: 31
--= 10.33
3  (округляем в большую сторону) = 11

Получается, что в отрезке значений [11;30] Петя побеждает своим первым ходом.

Ответ: 11

Решение программой

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 31: # если камней в куче стало больше 30
        return 0 # прекращаем игру
    moves = [game(first_heap+2),game(first_heap*3),game(first_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,31):
    if game(i) == 1: # если в данной позиции Петя побеждает первым ходом
        print(i)
        break

Ответ: 11

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

Задача 16#23696

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

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

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

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

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

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

Для начала определим отрезок, в котором игра заканчивается за один ход, при условии, что игрок не делает неудачных ходов. Максимальный ход доступный нам в партии это ∗2  . Минимальное значение отрезка равняется: 33
-- = 16,5
 2  (округляем в большую сторону) = 17

Получается, что в отрезке [17;32] игра завершается в один ход. Неудачный ход – это ход, который ухудшает вашу позицию в партии. Минимальное значение, из которого за один ход можно попасть в отрезок [17;32] равняется: 17
2 = 8,5  (округляем в большую сторону) = 9  .

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

Ответ: 9

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 33: # если камней в куче стало больше 32
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap+3),game(first_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,33):
    if game(i+1) == 1 or game(i+3) == 1 or game(i*2) == 1: # если в данной позиции после неудачного хода Пети возможен выигрыш Вани
        print(i)
        break

Решение АР

from functools import lru_cache

def moves(h):
    return (h + 1), (h + 3), (h * 2)

@lru_cache(None)
def game(h):
    if h >= 33:
        return "END"
    elif any(game(x) == "END" for x in moves(h)):
        return "WIN1"
    elif any(game(x) == "WIN1" for x in moves(h)):
        return "LOSE1"

for s in range(1, 33):
    if game(s) == "LOSE1":
        print(s)

Ответ: 9

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

Задача 17#23699

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

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

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

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

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

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

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

Максимальный ход доступный нам в партии это ∗2  . Определим отрезок, в котором игра завершается в один ход. Минимальное значение отрезка равняется: 46
--= 23
2

Получается, что в отрезке значений [23;45] игра заканчивается в один ход. Минимальное значение, из которого за один ход попасть в данный отрезок и есть минимальное значение, при котором Ваня может выиграть после неудачного хода Пети. Определим данное значение: 23= 11,5
2  (округляем в большую сторону) = 12

Ответ: 12

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 46: # если камней в куче стало больше 45
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_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,46):
    if game(i+1) == 1 or game(i*2) == 1: # если в данной позиции после неудачного хода Пети возможен выигрыш Вани
        print(i)
        break

Решение АР

from functools import lru_cache

def moves(heap):
    return heap + 1, heap * 2

@lru_cache(None)
def game(heap):
    if heap >= 46:
        return "END"
    elif any(game(x) == "END" for x in moves(heap)):
        return "WIN1"
    elif any(game(x) == "WIN1" for x in moves(heap)):
        return "LOSE1"
    elif any(game(x) == "LOSE1" for x in moves(heap)):
        return "WIN2"
    elif all(game(x) == "WIN1" or game(x) == "WIN2" for x in moves(heap)):
        return "LOSE2"

for s in range(1, 45):
    print(s, game(s))

Ответ: 12

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

Задача 18#23702

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

Например, имея кучу из 10 камней, за один ход можно получить кучу из 11, 12 или 20 камней. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней.

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

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

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

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

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

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

Максимальный ход доступный нам в партии это ∗2  . Определим отрезок, в котором игра заканчивается за один ход. Минимальное значение отрезка равняется: 38
--= 19
2

Получается, что в отрезке [19;37] игра заканчивается в один ход. Минимальное значение, из которого ходом ∗ 2  можно попасть в данный отрезок и есть минимальное значение S, из которого Ваня может победить после неудачного хода Пети. Определим данное значение: 19 = 9,5
 2  (округляем в большую сторону) = 10

Ответ: 10

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 38: # если камней в куче стало больше 37
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap+2),game(first_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,38):
    if game(i+1) == 1 or game(i+2) == 1 or game(i*2) == 1: # если в данной позиции после неудачного хода Пети возможен выигрыш Вани
        print(i)
        break

Решение АР

from functools import lru_cache
def moves(heap):
    return heap + 1, heap + 2, heap * 2
@lru_cache(None)
def game(heap):
    if heap >= 38:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(heap)):
        return ’WIN1’
    elif any(game(x) == ’WIN1’ for x in moves(heap)):
        return ’LOSE1’
    elif any(game(x) == ’LOSE1’ for x in moves(heap)):
        return ’WIN2’
    elif all(game(x) == ’WIN1’ or game(x) == ’WIN2’ for x in moves(heap)):
        return ’LOSE2’
for s in range(1, 38):
    print(s, game(s))

Ответ: 10

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

Задача 19#23805

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

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

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

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

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

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

Для начала нужно определить в каких ситуациях какие ходы мы можем совершать. Мы знаем, что после хода должно быть обязательно нечётное количество камней в куче. Если значение камней в куче это чётное число, то тогда мы можем совершить только + 1  ,+ 3  ходы, так как чётное + нечётное = нечётное число. В обратном случае, если значение камней в куче это нечётное число, то тогда мы можем совершить только ∗ 3  ход, так как нечётное * нечётное = нечётное число. Теперь определим при каких значениях Петя побеждает своим первым ходом. Максимальный ход, который мы имеем в партии это ∗3  ход. Значит, минимальное значение, при котором Петя побеждает своим первым ходом равняется: 51
 3 = 17  .

Поскольку это значение нечётное, то оно подходит. Получается, нам подходят все нечётные значения от 17  до    51  (17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49)  и также 48  и 50  , так как из этих значений можно дойти до 51+  камней ходом +3  . Теперь определелим значение, при котором Ваня побеждает своим первым ходом. Значение, из которого ВСЕ ходы ведут в вышеописанные значения – это значение, в котором Ваня выигрывает своим первым ходом. Распишем минимальное значение S, при котором Ваня побеждает первым ходом:

S = 7  . Петя может только увеличить количество камней до 21  . Ване не составит труда завершить партию следующим ходом.

Ответ: 7

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 51: # если камней в куче стало больше 50
        return 0 # прекращаем игру
    moves = [] # cписок всех возможных ходов в партии
    if first_heap % 2 == 0: # если количество камней в куче является чётным
        # то можем совершить только +1, +3 ходы, так как чётное+нечётное = нечётное
        moves = [game(first_heap+1),game(first_heap+3)]
    else: # если количество камней в куче является нечётным
        # то можем совершить только *3 ход, так как нечётное*нечётное = нечётное
        moves = [game(first_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,51):
    # если в данной позиции возможен выигрыш Вани первым ходом
    if game(i) == -1:
        print(i)
        break

Решение АР

from functools import lru_cache

def moves(heap):
    m = []
    if (heap * 3) % 2 != 0:
        m += [heap * 3]
    if (heap + 1) % 2 != 0:
        m += [heap + 1]
    if (heap + 3) % 2 != 0:
        m += [heap + 3]
    return m

@lru_cache(None)
def game(heap):
    if heap >= 51:
        return ’END’
    elif any(game(x) == ’END’ for x in moves(heap)):
        return ’WIN1’
    elif all(game(x) == ’WIN1’ for x in moves(heap)):
        return ’LOSE1’
    elif any(game(x) == ’LOSE1’ for x in moves(heap)):
        return ’WIN2’
    elif all(game(x) == ’WIN1’ or game(x) == ’WIN2’ for x in moves(heap)):
        return ’LOSE2’

for s in range(1, 51):
    if game(s) == ’LOSE1’:
        print(s)
        break

Ответ: 7

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

Задача 20#25563

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

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

При каком значении S  Ваня выигрывает первым ходом при любой игре Пети?

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

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

Для начала определим значения, при которых Петя побеждает первым ходом. Максимальный ход доступный нам в партии это ∗3  . Минимальное значение отрезка значений, в которых Петя побеждает первым ходом равняется: 75 = 25
 3

Получается, что в отрезке [25;74] Петя выигрывает своим первым ходом. Теперь определим значение, в котором Ваня побеждает своим первым ходом. Значение, из которого ВСЕ ходы ведут в вышеописанный отрезок – это значение, в котором Ваня выигрывает своим первым ходом. Распишем значение и стратегии, при которых Ваня побеждает первым ходом:

S = 24  . Петя может увеличить количество камней до 25  , 26  или 72  камней. Во всех этих случаях Ване не составит труда завершить партию следующим ходом.

Ответ: 24

Решение БУ

from functools import lru_cache
@lru_cache(None)
def game(first_heap): # функция игры
    if first_heap >= 75: # если камней в куче стало больше 74
        return 0 # прекращаем игру
    moves = [game(first_heap+1),game(first_heap+2),game(first_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,75):
    if game(i) == -1: # если в данной позиции возможен выигрыш Вани первым ходом
        print(i)

Решение АР

from functools import lru_cache


def moves(h):
    return h+1, h+2, h*3


@lru_cache(None)
def f(h):
    if h >= 75:
        return ’END’
    if any(f(i) == ’END’ for i in moves(h)):
        return ’WIN1’
    if all(f(i) == ’WIN1’ for i in moves(h)):
        return ’LOSE1’


for i in range(1, 75):
    print(i, f(i))

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