Задания
Версия для печати и копирования в MS Word
Тип 19 № 78075
i

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

—  убрать из кучи два камня,

—  умень­шить ко­ли­че­ство кам­ней в куче в три раза (ко­ли­че­ство кам­ней, по­лу­чен­ное при де­ле­нии, округ­ля­ет­ся до мень­ше­го).

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

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

В на­чаль­ный мо­мент в пер­вой куче было 17 кам­ней, во вто­рой куче  — S кам­ней; S > 149.

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

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

Спрятать решение

Ре­ше­ние.

При­ведём ре­ше­ние на языке Python.

def f(x, y, h):

if h == 3 and x + y <= 165:

return 1

elif h == 3 and x + y > 165:

return 0

elif x + y <= 165 and h < 3:

return 0

else:

if h % 2 == 0:

return f(x - 2, y, h + 1) or f(x, y - 2, h + 1) or f(x // 3, y, h + 1) or f(x, y // 3, h + 1) # стра­те­гия по­бе­ди­те­ля

else:

return f(x - 2, y, h + 1) or f(x, y - 2, h + 1) or f(x // 3, y, h + 1) or f(x, y // 3, h + 1) # стра­те­гия про­иг­рав­ше­го(не­удач­ный ход)

for x in range(10000, 10, -1):

if f(x, 17, 1) == 1:

print("За­да­ча 19:", x)

break

 

Ответ: 1340.