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

Для игры, опи­сан­ной в за­да­нии 19, най­ди­те ми­ни­маль­ное зна­че­ние S, при ко­то­ром од­но­вре­мен­но вы­пол­ня­ют­ся два усло­вия:

—  у Вани есть вы­иг­рыш­ная стра­те­гия, поз­во­ля­ю­щая ему вы­иг­рать пер­вым или вто­рым ходом при любой игре Пети;

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

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

Ре­ше­ние.

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

def f(x, y, h):

if (h == 3 or h == 5) and x + y <= 165:

return 1

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

return 0

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

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) and f(x, y - 2, h + 1) and f(x // 3, y, h + 1) and f(x, y // 3, h + 1) # стра­те­гия про­иг­рав­ше­го(любой ход)

def f1(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 f1(x - 2, y, h + 1) or f1(x, y - 2, h + 1) or f1(x // 3, y, h + 1) or f1(x, y // 3, h + 1) # стра­те­гия по­бе­ди­те­ля

else:

return f1(x - 2, y, h + 1) and f1(x, y - 2, h + 1) and f1(x // 3, y, h + 1) and f1(x, y // 3, h + 1) # стра­те­гия про­иг­рав­ше­го(любой ход)

for x in range(10, 1000):

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

print(x)

print("====")

for x in range(1, 1000):

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

print(x)

 

 

Ответ: 451.

 

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

def f(x, y, z):

if x+y <= 165: return z%2==0

if z == 0: return 0

h = [f(x - 2, y, z - 1),

f(x // 3, y, z - 1),

f(x, y - 2, z - 1),

f(x, y//3, z - 1)]

return any(h) if (z-1) % 2 == 0 else all(h)

# print(19, max([s for s in range(149, 10000) if f(17, s, 2)]))

# print(20, [s for s in range(149, 10000) if (not f(17, s, 1)) and f(17, s, 3)])

print(21, [s for s in range(149, 10000) if (f(17, s, 2) or f(17, s, 4)) and (not f(17, s, 2))])