19.01 Перекладывание камней одна куча
Готовиться с нами - ЛЕГКО!
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по
очереди, первый ход делает Петя. За один ход игрок может добавить в кучу два камня или пять
камней или увеличить количество камней в куче в три раза. У каждого игрока, чтобы делать ходы,
есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в
куче становится не менее 49. Победителем считается игрок, сделавший последний ход, то есть первым
получивший кучу, в которой будет 49 или больше камней. В начальный момент в куче было S камней,
.
Найдите минимальное значение S, при котором Ваня выигрывает своим первым ходом при любой игре Пети?
Решение руками
Для начала определим значения, при которых Петя побеждает первым ходом. Максимальный ход доступный нам в
партии это . Минимальное значение отрезка значений, в которых Петя побеждает первым ходом равняется:
(округляем в большую сторону) =
Получается, что в отрезке [17;48] Петя выигрывает своим первым ходом. Теперь определим значение, в котором Ваня побеждает своим первым ходом. Значение, из которого ВСЕ ходы ведут в вышеописанный отрезок – это значение, в котором Ваня выигрывает своим первым ходом. Распишем значение и стратегии, при которых Ваня побеждает первым ходом:
. Петя может увеличить количество камней до
,
или
камней. Во всех этих случаях Ване не
составит труда завершить партию следующим ходом.
. Петя может увеличить количество камней до
,
или
камней. Во всех этих случаях Ване не
составит труда завершить партию следующим ходом.
В ответ нужно указать минимальное значение S. Ответ:
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap): # функция игры if first_heap >= 49: # если камней в куче стало больше 48 return 0 # прекращаем игру moves = [game(first_heap+2),game(first_heap+5),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,49): if game(i) == -1: # если в данной позиции возможен выигрыш Вани первым ходом print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в кучу три камня или увеличить количество
камней в куче в два раза. Например, имея кучу из 25 камней, за один ход можно получить кучу из 28 или 50
камней. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней. Игра завершается в тот
момент, когда количество камней в куче становится не менее 57. Победителем считается игрок, сделавший последний
ход, то есть первым получивший кучу, в которой будет 57 или больше камней. В начальный момент в куче было S
камней, .
Найдите минимальное значение S, при котором Ваня выигрывает своим первым ходом при любой игре Пети?
Решение руками
Максимальный ход, который мы имеем в игре это , это значит, что промежуток, в котором игрок выигрывает в
один ход располагается от
до
.
Значит, нам нужно найти минимальное значение, при котором количество камней в куче после хода Пети
будет находиться в промежутке, объявленном в предыдущем предложении. Это значение будет равняться
.
Программное решение
from functools import lru_cache @lru_cache(None) def game(first_heap): # функция игры if first_heap >= 57: # если камней в куче стало больше 56 return 0 # прекращаем игру moves = [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,57): if game(i) == -1: # если в данной позиции возможен выигрыш Вани первым ходом print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один или шесть камней либо увеличить количество камней в куче в три раза. У каждого игрока есть неограниченное количество камней, чтобы делать ходы. Игра завершается в тот момент, когда количество камней в куче становится не менее 40. Победителем считается игрок, сделавший последний ход, т.е. первым получивший кучу из 40 или более камня.
В начальный момент в куче было S камней; .
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Укажите количество значений S, при которых у Пети есть выигрышная стратегия, но он не может выиграть своим первым ходом, а может выиграть своим вторым ходом после неудачного хода Вани.
Решение руками
Максимальный ход доступный нам в партии это . Определим отрезок, в котором игра заканчивается за
один ход. Минимальное значение отрезка равняется:
(округляем в большую сторону) =
Получается, что в отрезке [14;39] игра заканчивается в один ход. Если значение S после первого хода Пети не находится в данном отрезке, то Ваня специально совершит такой ход, чтобы после него значение S находилось в данном отрезке для того чтобы Петя смог завершить партию следующим ходом. А если значение S после первого хода уже находится в данном отрезке, то Ваня специально совершить такой ход, чтобы не завершить партию, а просто передать очередь хода Пете для того чтобы он завершил партию. Распишем значения и стратегии, при которых Петя не может победить за один ход, но может победить вторым ходом после неудачного хода Вани:
. Петя увеличит количество камней до
, а Ваня увеличит количество камней до
. Пете не составит
труда завершить партию следующим ходом.
. Петя увеличит количество камней до
, а Ваня увеличит количество камней до
или
. Пете не
составит труда завершить партию следующим ходом.
. Петя увеличит количество камней до
, а Ваня увеличит количество камней до
или
. Пете не
составит труда завершить партию следующим ходом.
. Петя увеличит количество камней до
или
или
, а Ваня увеличит количество камней до
или
,
или
,
. Пете не составит труда завершить партию следующим ходом.
. Петя увеличит количество камней до
или
или
, а Ваня увеличит количество камней до
или
,
или
,
.Пете не составит труда завершить партию следующим ходом.
. Петя увеличит количество камней до
или
или
, а Ваня увеличит количество камней до
или
,
или
,
. Пете не составит труда завершить партию следующим ходом.
. Петя увеличит количество камней до
или
или
, а Ваня увеличит количество камней до
,
или
,
,
или
,
. Пете не составит труда завершить партию следующим ходом.
. Петя увеличит количество камней до
или
или
, а Ваня увеличит количество камней до
,
или
,
или
,
. Пете не составит труда завершить партию следующим ходом.
. Петя увеличит количество камней до
или
или
, а Ваня увеличит количество камней до
,
или
,
или
,
. Пете не составит труда завершить партию следующим ходом.
. Петя увеличит количество камней до
или
или
, а Ваня увеличит количество камней до
,
или
,
или
,
. Пете не составит труда завершить партию следующим ходом.
. Петя увеличит количество камней до
или
или
, а Ваня увеличит количество камней до
,
или
,
или
,
. Пете не составит труда завершить партию следующим ходом.
. Петя увеличит количество камней до
или
или
, а Ваня увеличит количество камней до
,
или
,
или
. Пете не составит труда завершить партию следующим ходом.
. Петя увеличит количество камней до
или
, а Ваня увеличит количество камней до
,
или
,
. Пете не составит труда завершить партию следующим ходом.
В ответ нужно указать количество значений S. Ответ:
Программное решение
from functools import lru_cache @lru_cache(None) def game(first_heap): # функция игры if first_heap >= 40: # если камней в куче стало больше 39 return 0 # прекращаем игру moves = [game(first_heap+1),game(first_heap+6),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) count = 0 for i in range(1,40): # проверка, что Петя не может выиграть за один ход # проверка, что Петя может выиграть вторым ходом после неудачного хода Вани. Расписываем всевозможные первые два хода и проверяем можно ли после них завершить игру за один ход. if game(i) != 1 and (game(i+1+1) == 1 or game(i+1+6) == 1 or game(i+1*3) == 1 or game(i+6+1) == 1 or game(i+6+6) == 1 or game(i+6*3) == 1 or game(i*3+1) == 1 or game(i*3+6) == 1 or game(i*3*3) == 1): count += 1 print(count)
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по
очереди, первый ход делает Петя. За один ход игрок может добавить в кучу три камня или пять
камней или увеличить количество камней в куче в два раза. У каждого игрока, чтобы делать ходы,
есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в
куче становится не менее 67. Победителем считается игрок, сделавший последний ход, то есть первым
получивший кучу, в которой будет 67 или больше камней. В начальный момент в куче было S камней,
.
Найдите минимальное значение S, при котором Ваня выигрывает своим первым ходом при любой игре Пети?
Решение руками
Для начала определим значения, при которых Петя побеждает первым ходом. Максимальный ход доступный нам в
партии это . Минимальное значение отрезка значений, в которых Петя побеждает первым ходом равняется:
(округляем в большую сторону) =
Получается, что в отрезке [34;66] Петя выигрывает своим первым ходом. Теперь определим значение, в котором Ваня побеждает своим первым ходом. Значение, из которого ВСЕ ходы ведут в вышеописанный отрезок – это значение, в котором Ваня выигрывает своим первым ходом. Распишем значение и стратегии, при которых Ваня побеждает первым ходом:
. Петя может увеличить количество камней до
,
или
камней. Во всех этих случаях Ване не
составит труда завершить партию следующим ходом.
. Петя может увеличить количество камней до
,
или
камней. Во всех этих случаях Ване не
составит труда завершить партию следующим ходом.
. Петя может увеличить количество камней до
,
или
камней. Во всех этих случаях Ване не
составит труда завершить партию следующим ходом.
В ответ нужно указать минимальное значение S. Ответ:
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap): # функция игры if first_heap >= 67: # если камней в куче стало больше 66 return 0 # прекращаем игру moves = [game(first_heap+3),game(first_heap+5),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) count = 0 for i in range(1,67): if game(i) == -1: # если в данной позиции возможен выигрыш Вани первым ходом print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в кучу четыре камня или увеличить количество
камней в куче в три раза. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней. Игра
завершается в тот момент, когда количество камней в куче становится не менее 72. Победителем считается игрок,
сделавший последний ход, то есть первым получивший кучу, в которой будет 72 или больше камней. В начальный
момент в куче было S камней, .
Найдите минимальное значение S, при котором Ваня выигрывает своим первым ходом при любой игре Пети?
Решение руками
Для начала определим значения, при которых Петя побеждает первым ходом. Максимальный ход доступный нам в
партии это . Минимальное значение отрезка значений, в которых Петя побеждает первым ходом равняется:
Получается, что в отрезке [24;71] Петя выигрывает своим первым ходом. Теперь определим значение, в котором Ваня побеждает своим первым ходом. Значение, из которого ВСЕ ходы ведут в вышеописанный отрезок – это значение, в котором Ваня выигрывает своим первым ходом. Распишем значение и стратегии, при которых Ваня побеждает первым ходом:
. Петя может увеличить количество камней до
,
камней. Во всех этих случаях Ване не составит
труда завершить партию следующим ходом.
. Петя может увеличить количество камней до
,
камней. Во всех этих случаях Ване не составит
труда завершить партию следующим ходом.
. Петя может увеличить количество камней до
,
камней. Во всех этих случаях Ване не составит
труда завершить партию следующим ходом.
. Петя может увеличить количество камней до
,
камней. Во всех этих случаях Ване не составит
труда завершить партию следующим ходом.
В ответ нужно указать минимальное значение S. Ответ:
Программное решение
from functools import lru_cache @lru_cache(None) def game(first_heap): # функция игры if first_heap >= 72: # если камней в куче стало больше 71 return 0 # прекращаем игру moves = [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,72): if game(i) == -1: # если в данной позиции возможен выигрыш Вани первым ходом print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в кучу шесть камней или увеличить количество
камней в куче в два раза. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней. Игра
завершается в тот момент, когда количество камней в куче становится не менее 81. Победителем считается игрок,
сделавший последний ход, то есть первым получивший кучу, в которой будет 81 или больше камней. В начальный
момент в куче было S камней, .
Найдите минимальное значение S, при котором Ваня выигрывает своим первым ходом при любой игре Пети?
Решение руками
Для начала определим значения, при которых Петя побеждает первым ходом. Максимальный ход доступный нам в
партии это . Минимальное значение отрезка значений, в которых Петя побеждает первым ходом равняется:
(округляем в большую сторону) =
Получается, что в отрезке [41;40] Петя выигрывает своим первым ходом. Теперь определим значение, в котором Ваня побеждает своим первым ходом. Значение, из которого ВСЕ ходы ведут в вышеописанный отрезок – это значение, в котором Ваня выигрывает своим первым ходом. Распишем стратегии ходов у минимального подходящего значения, при которых Ваня побеждает первым ходом:
. Петя может увеличить количество камней до
или
камней. Во всех этих случаях Ване не составит
труда завершить партию следующим ходом.
Ответ:
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap): # функция игры if first_heap >= 81: # если камней в куче стало больше 80 return 0 # прекращаем игру moves = [game(first_heap+6),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,80): if game(i) == -1: # если в данной позиции возможен выигрыш Вани первым ходом print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в кучу два камня или увеличить количество
камней в куче в два раза. Например, имея кучу из 15 камней, за один ход можно получить кучу из 17 или 30
камней. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней. Игра завершается в тот
момент, когда количество камней в куче становится не менее 38. Победителем считается игрок, сделавший последний
ход, то есть первым получивший кучу, в которой будет 38 или больше камней. В начальный момент в куче было S
камней, .
Найдите минимальное значение S, при котором Ваня выигрывает своим первым ходом при любой игре Пети?
Решение руками
Петя может прибавить в кучу два камня или увеличить кучу в два раза, то есть из начальной кучи получится
куча равная
или куча равная
. Тогда Ваня, чтобы наверняка выиграть, домножит кучу на
,
значит:
|
Программное решение
from functools import lru_cache @lru_cache(None) def game(first_heap): # функция игры if first_heap >= 38: # если камней в куче стало больше 37 return 0 # прекращаем игру moves = [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) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в кучу два камня или увеличить количество
камней в куче в три раза. Например, имея кучу из 15 камней, за один ход можно получить кучу из 17 или 45
камней. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней. Игра завершается в тот
момент, когда количество камней в куче становится не менее 47. Победителем считается игрок, сделавший последний
ход, то есть первым получивший кучу, в которой будет 47 или больше камней. В начальный момент в куче было S
камней, .
Найдите минимальное значение S, при котором Ваня выигрывает своим первым ходом при любой игре Пети?
Решение руками
Петя может прибавить в кучу два камня или увеличить кучу в три раза, то есть из начальной кучи получится
куча равная
или куча равная
. Тогда Ваня, чтобы наверняка выиграть, домножит кучу на
,
значит:
|
Программное решение
from functools import lru_cache @lru_cache(None) def game(first_heap): # функция игры if first_heap >= 47: # если камней в куче стало больше 46 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,47): if game(i) == -1: # если в данной позиции возможен выигрыш Вани первым ходом print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в кучу четыре камня или увеличить количество
камней в куче в два раза. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней. Игра
завершается в тот момент, когда количество камней в куче становится не менее 55. Победителем считается игрок,
сделавший последний ход, то есть первым получивший кучу, в которой будет 55 или больше камней. В начальный
момент в куче было S камней, .
Найдите минимальное значение S, при котором Ваня выигрывает своим первым ходом при любой игре Пети?
Решение руками
Петя может прибавить в кучу четыре камня или увеличить кучу в два раза, то есть из начальной кучи S получится
куча равная или куча равная
. Тогда Ваня, чтобы наверняка выиграть, домножит кучу на
,
значит:
|
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap): # функция игры if first_heap >= 55: # если камней в куче стало больше 54 return 0 # прекращаем игру moves = [game(first_heap+4),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,55): if game(i) == -1: # если в данной позиции возможен выигрыш Вани первым ходом print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в кучу один или два камня или увеличить
количество камней в куче в два раза. У каждого игрока, чтобы делать ходы, есть неограниченное количество
камней. Игра завершается в тот момент, когда количество камней в куче становится не менее 29. Победителем
считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 29 или больше камней. В
начальный момент в куче было S камней, .
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.
Решение руками
Неудачный ход Пети это ход умножить кучу на два, то есть . Тогда Ваня, чтобы наверняка выиграть,
домножит кучу на
, значит:
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap): # функция игры if first_heap >= 29: # если камней в куче стало больше 28 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,29): if game(i+1) == 1 or game(i+2) == 1 or game(i*2) == 1: # если в данной позиции после неудачного хода Пети возможен выигрыш Вани print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить три или пять камней или увеличить количество
камней в куче в три раза. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней. Игра
завершается в тот момент, когда количество камней в куче становится не менее 61. Победителем считается игрок,
сделавший последний ход, то есть первым получивший кучу, в которой будет 61 или больше камней. В начальный
момент в куче было S камней, .
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.
Решение руками
Неудачный ход Пети это ход умножить кучу на три, то есть . Тогда Ваня, чтобы наверняка выиграть,
домножит кучу на
, значит:
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap): # функция игры if first_heap >= 61: # если камней в куче стало больше 60 return 0 # прекращаем игру moves = [game(first_heap+3),game(first_heap+5),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,61): if game(i+3) == 1 or game(i+5) == 1 or game(i*3) == 1: # если после неудачного хода Пети возможен выигрыш Вани print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в кучу 1 камень, либо увеличить число камней в куче в 2
или 4 раза. Например, имея кучу из 10 камней, за один ход можно получить кучу из 11, 20 или 40 камней. Для того
чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда
количество камней в куче становится не менее 58. Победителем считается игрок, сделавший последний ход, т.е. первым
получивший такую позицию, при которой в куче будет 58 или больше камней. В начальный момент в куче было S
камней; .
Известно, что Ваня выиграл своим первым ходом после неудачного первого хода Пети. Укажите минимальное значение S, когда такая ситуация возможна.
Решение руками
Обратим внимание, что в задаче Петя своим первым ходом совершает ошибку, благодаря которой Ваня выигрывает.
Так как нас интересует минимальное S, при котором такая ситуация возможна, работаем мы с самым сильным ходом, а
именно . Найдем кол-во камней, из которого Ваня мог выиграть:
камней – минимальная позиция
(=> диапазон для выигрыша = [15,57]). Такое количество Петя мог «подарить» сопернику любым из своих ходов, но
для минимального значения вновь обращаемся к
:
. Следовательно, самой маленькой кучкой,
при которой Петя мог совершить неудачный ход и помочь Ване выиграть, является куча при
.
(
)
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap): # функция игры if first_heap >= 58: # если камней в куче стало больше 57 return 0 # прекращаем игру moves = [game(first_heap+1),game(first_heap*2),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(1,58): if game(i+1) == 1 or game(i*2) == 1 or game(i*4) == 1: # если в данной позиции после неудачного хода Пети возможен выигрыш Вани print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в кучу три камня или увеличить количество
камней в куче в два раза. Например, имея кучу из 15 камней, за один ход можно получить кучу из 18 или 30
камней. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней. Игра завершается в тот
момент, когда количество камней в куче становится не менее 46. Победителем считается игрок, сделавший последний
ход, то есть первым получивший кучу, в которой будет 46 или больше камней. В начальный момент в куче было S
камней, .
Найдите минимальное значение S, при котором Ваня выигрывает своим первым ходом при любой игре Пети?
Решение руками
Для начала определим значения, при которых Петя побеждает первым ходом. Максимальный ход доступный нам в
партии это . Минимальное значение отрезка значений, в которых Петя побеждает первым ходом равняется:
Получается, что в отрезке [23;45] Петя выигрывает своим первым ходом. Теперь определим значение, в котором Ваня побеждает своим первым ходом. Значение, из которого ВСЕ ходы ведут в вышеописанный отрезок – это значение, в котором Ваня выигрывает своим первым ходом. Распишем значение и стратегии, при которых Ваня побеждает первым ходом:
. Петя может увеличить количество камней до
или
камней. Во всех этих случаях Ване не составит
труда завершить партию следующим ходом.
. Петя может увеличить количество камней до
или
камней. Во всех этих случаях Ване не составит
труда завершить партию следующим ходом.
. Петя может увеличить количество камней до
или
камней. Во всех этих случаях Ване не составит
труда завершить партию следующим ходом.
В ответ нужно указать минимальное значение S. Ответ:
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap): # функция игры if first_heap >= 46: # если камней в куче стало больше 45 return 0 # прекращаем игру moves = [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,46): if game(i) == -1: # если в данной позиции возможен выигрыш Вани первым ходом print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу два или три камня либо увеличить количество камней в куче в два раза. У каждого игрока есть неограниченное количество камней, чтобы делать ходы.
Игра завершается в тот момент, когда количество камней в куче становится не менее 80. Победителем считается игрок, сделавший последний ход, т.е. первым получивший кучу из 80 камней или больше.
В начальный момент в куче было S камней; .
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника.
Укажите минимальное значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.
Решение руками
Для начала определим значения, при которых Петя побеждает первым ходом. Максимальный ход доступный нам в
партии это Минимальное значение отрезка значений, в которых Петя побеждает первым ходом равняется:
Получается, что в отрезке [40;79] Петя выигрывает своим первым ходом. Теперь определим значение, в котором Ваня побеждает своим первым ходом. Значение, из которого ВСЕ ходы ведут в вышеописанный отрезок – это значение, в котором Ваня выигрывает своим первым ходом. Распишем значение и стратегии, при которых Ваня побеждает первым ходом:
. Петя может увеличить количество камней до
,
или
камней. Во всех этих случаях Ване не
составит труда завершить партию следующим ходом.
. Петя может увеличить количество камней до
,
или
камней. Во всех этих случаях Ване не
составит труда завершить партию следующим ходом.
В ответ нужно указать минимальное значение S. Ответ:
Решение БУ
from functools import lru_cache @lru_cache(None) def f(x): if x >= 80: return 0 t = [f(x + 2), f(x + 3), f(x * 2)] h = [i for i in t if i <= 0] if h: return -max(h) + 1 else: return -max(t) for s in range(1, 79 + 1): if f(s) == -1: print(s) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в два раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в куче становится не менее 70. Победителем считается игрок, сделавший последний ход, т.е. первым получивший кучу, в которой будет 70 или больше камней.
В начальный момент в куче было S камней, .
Укажите такое значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.
Решение руками
Для начала определим значения, при которых Петя побеждает первым ходом. Максимальный ход
доступный нам в партии это Минимальное значение отрезка значений, в которых Петя побеждает
первым ходом равняется:
. Получается, что в отрезке [35;69] Петя выигрывает своим первым
ходом.
Определим значение, в котором Ваня побеждает своим первым ходом. Значение, из которого все ходы ведут в отрезок [35; 69] – это значение, в котором Ваня выигрывает своим первым ходом.
Единственное значение , при котором Ваня выиграет своим первым ходом, является
.
Решение программой
def f(a): if a >= 70:return 0 t = [f(a+1),f(a*2)] n= [i for i in t if i <= 0] if n:return -max(n) + 1 return -max(t) for i in range(1,70): if f(i) == -1: print(i)
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу два камня, три камня, или увеличить количество камней в куче в три раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в куче становится не менее 120. Победителем считается игрок, сделавший последний ход, т.е. первым получивший кучу, в которой будет 120 или больше камней.
В начальный момент в куче было S камней, .
Укажите минимальное значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.
Решение руками
Для начала определим значения, при которых Петя побеждает первым ходом. Максимальный ход доступный нам в
партии это . Минимальное значение отрезка значений, в которых Петя побеждает первым ходом равняется:
Получается, что в отрезке [40;119] Петя выигрывает своим первым ходом. Теперь определим значение, в котором Ваня побеждает своим первым ходом. Значение, из которого ВСЕ ходы ведут в вышеописанный отрезок – это значение, в котором Ваня выигрывает своим первым ходом. Распишем значение и стратегии, при которых Ваня побеждает первым ходом:
. Петя может увеличить количество камней до
,
или
камней. Во всех этих случаях Ване не
составит труда завершить партию следующим ходом.
. Петя может увеличить количество камней до
,
или
камней. Во всех этих случаях Ване не
составит труда завершить партию следующим ходом.
В ответ нужно указать минимальное значение S. Ответ:
Решение БУ
from functools import lru_cache @lru_cache(None) def game(first_heap): # функция игры if first_heap >= 120: # если камней в куче стало больше 119 return 0 # прекращаем игру moves = [game(first_heap+2),game(first_heap+3),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,120): if game(i) == -1: # если в данной позиции возможен выигрыш Вани первым ходом print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу один камень или увеличить количество камней в куче в два раза. Для того чтобы делать ходы, у каждого игрока есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в куче становится не менее 64. Победителем считается игрок, сделавший последний ход, т.е. первым получивший кучу, в которой будет 64 или больше камней.
В начальный момент в куче было S камней, .
Укажите такое значение S, при котором Петя не может выиграть за один ход, но при любом ходе Пети Ваня может выиграть своим первым ходом.
Решение руками
Для начала определим значения, при которых Петя побеждает первым ходом. Максимальный ход доступный нам в
партии это . Минимальное значение отрезка значений, в которых Петя побеждает первым ходом равняется:
Получается, что в отрезке [32;63] Петя выигрывает своим первым ходом. Теперь определим значение, в котором Ваня побеждает своим первым ходом. Значение, из которого ВСЕ ходы ведут в вышеописанный отрезок – это значение, в котором Ваня выигрывает своим первым ходом. Распишем значение и стратегии, при которых Ваня побеждает первым ходом:
. Петя может увеличить количество камней до
или
камней. Во всех этих случаях Ване не составит
труда завершить партию следующим ходом.
Ответ:
Решение программой:
Для решения на Python используем рекурсию с проверкой всех возможных ходов (,
), чтобы определить, чья
это выигрышная позиция.
Функция возвращает , если игра уже завершена (камней
), положительное число — если при оптимальной игре
побеждает текущий игрок, и отрицательное – если побеждает соперник.
Так как первый ход делает Петя, цикл запускается от его лица: если значение функции положительное,
выигрвает Пете, а если отрицательное – Ваня. Если функция вернёт - значит Петя гарантированно
проиграл первым ходом, а Ваня выиграл. При переборе возможных начальных значений программа выводит
.
# lru_cache позволит сэкономить ресурсы компьютера. Функция будет сохранять прошлые значения функций, а значит не придётся считать из заново. from functools import lru_cache @lru_cache(None) def game(first_heap): # Функция игры if first_heap >= 64: # Если камней в куче стало больше 64 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 # От лица Пети будет выигрыш (положительное число, прибавляем 1, поскольку это будет уже следующий ход) else: # Если в данной позиции выигрыш Вани return -max(moves) # От лица Пети будет проигрыш (отрицательное число) for i in range(1, 64): # Переберём возможные значения if game(i) == -1: # Если в данной позиции возможен выигрыш Вани первым ходом print(i) # Выведем нужное значение
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди,
первый ход делает Петя. За один ход игрок может добавить в кучу три камня или увеличить количество камней в 4
раза. Игра завершается в тот момент, когда количество камней куче становится не менее 100. Игрок,
который получил 120 и более камней, считается проигравшим. В начальный момент в куче было S камней;
.
Будем говорить, что игрок имеет выигрышную стратегию, если он может выиграть при любых ходах противника. Укажите минимальное значение S, при котором Петя выигрывает, совершив всего лишь один ход.
Решение руками
Для начала определим значение, начиная с которого мы не можем совершать для того чтобы не проиграть.
Это значение равняется:
. Начиная с
камней в куче мы не может совершать ход
.
Определим значения, в которых Петя побеждает своим первым ходом. Минимальное значение равняется:
. Получается, что в отрезке значений [25;29] Петя выигрывает первым ходом, совершая ход
.
В ответ нужно указать минимальное значение S. Ответ: .
Программное решение
from functools import lru_cache @lru_cache(None) def game(first_heap): # функция игры if first_heap >= 100: # если камней в куче стало больше 99 return 0 # прекращаем игру moves = [] # cписок всех возможных ходов в партии # если текущее количество камней в куче, помноженное на 4 больше или равно 120 if first_heap * 4 >= 120: moves = [game(first_heap+3)] # то можем делать только ход +3 else: moves = [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(1,61): # если в данной позиции возможен выигрыш Пети первым ходом if game(i) == 1: print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может:
а) добавить в кучу 7 камней;
б) увеличить количество камней в куче в три раза;
в) добавить в кучу 5 камней.
Игра завершается в тот момент, когда количество камней в куче становится не менее 65. Игрок, сделавший ход,
который привел к значению 109 или более, считается проигравшим. В начальный момент в куче было S камней,
.
Известно, что Петя одержал победу, совершив один ход за игру. Найдите минимальное значение S, при котором Петя гарантированно одерживает победу для описанной стратегии.
Решение руками
Для начала определим значение, начиная с которого мы не можем совершать для того чтобы не проиграть.
Это значение равняется:
. Округляем в большую сторону -
. Начиная с
камней в куче мы не
может совершать ход
. Определим значения, в которых Петя побеждает своим первым ходом. Минимальное
значение равняется:
. Округляем в большую сторону -
. Получается, что в отрезке значений [22;36]
Петя выигрывает первым ходом, совершая ход
.
В ответ нужно указать минимальное значение S. Ответ: .
Программное решение
from functools import lru_cache @lru_cache(None) def game(first_heap): # функция игры if first_heap >= 65: # если камней в куче стало больше 64 return 0 # прекращаем игру moves = [] # cписок всех возможных ходов в партии # если текущее количество камней в куче, помноженное на 3 больше или равно 109 if first_heap * 3 >= 109: moves = [game(first_heap+5),game(first_heap+7)] # то можем делать только +5,+7 ходы else: moves = [game(first_heap+5),game(first_heap+7),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,40): # если в данной позиции возможен выигрыш Пети первым ходом if game(i) == 1: print(i) break
Ошибка.
Попробуйте повторить позже
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежит куча камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в кучу два камня или пять камней, или увеличить количество камней в куче в два раза. У каждого игрока, чтобы делать ходы, есть неограниченное количество камней. Игра завершается в тот момент, когда количество камней в куче становится не менее 47. Победителем считается игрок, сделавший последний ход, то есть первым получивший кучу, в которой будет 47 или больше камней.
В начальный момент в куче было S камней, .
Найдите минимальное значение S, при котором Ваня выигрывает своим первым ходом при любой игре Пети?
Решение руками
Для начала определим значения, при которых Петя побеждает первым ходом. Максимальный ход доступный нам в
партии это . Минимальное значение отрезка значений, в которых Петя побеждает первым ходом равняется:
(округляем в большую сторону) =
Получается, что в отрезке [24;46] Петя выигрывает своим первым ходом. Теперь определим значение, в котором Ваня побеждает своим первым ходом. Значение, из которого ВСЕ ходы ведут в вышеописанный отрезок – это значение, в котором Ваня выигрывает своим первым ходом. Распишем значение и стратегии, при которых Ваня побеждает первым ходом:
. Петя может увеличить количество камней до
,
или
камней. Во всех этих случаях Ване не
составит труда завершить партию следующим ходом.
. Петя может увеличить количество камней до
,
или
камней. Во всех этих случаях Ване не
составит труда завершить партию следующим ходом.
В ответ нужно указать минимальное значение S. Ответ:
Решение БУ
def f(a): if a >= 47: #если камней в куче стало больше 47, то выход из функции return 0 t = [f(a+2), f(a+5), f(a*2)] #сформировали список ходов n = [i for i in t if i <= 0] #записываем отрицательные элементы из t if n: #если n не пустой список return -max(n)+1 #получаем положительный выигрышный ход для Пети else: return -max(t) #получаем отрицательный выигрышный ход для Вани for i in range(1,47): if f(i) == -1: print(i)