В игре, описанной
Найдите такое значение S, при котором у Вани есть стратегия, позволяющая ему выиграть вторым ходом при любой игре Пети, но у Вани нет стратегии, которая позволяла бы ему гарантированно выиграть первым ходом.
Приведём другое решение на языке Python.
def f(x, y, h):
if (h == 2 or h == 4) and x + y >= 41:
return 1
if h == 4 and x + y < 41:
return 0
if (h == 1 or h == 3) and x + y >= 41:
return 0
else:
if h % 2 != 0:
if x > y:
return f(x + 1, y, h + 1) or f(x + 2, y, h + 1) or f(x + 3, y, h + 1) or f(x, y * 2, h + 1)
elif x < y:
return f(x, y + 1, h + 1) or f(x, y + 2, h + 1) or f(x, y + 3, h + 1) or f(x * 2, y, h + 1)
elif x == y:
return f(x + 1, y, h + 1) or f(x + 2, y, h + 1) or f(x + 3, y, h + 1) or f(x, y + 1, h + 1) or f(x, y + 2, h + 1) or f(x, y + 3, h + 1)
else:
if x > y:
return f(x + 1, y, h + 1) and f(x + 2, y, h + 1) and f(x + 3, y, h + 1) and f(x, y * 2, h + 1)
elif x < y:
return f(x, y + 1, h + 1) and f(x, y + 2, h + 1) and f(x, y + 3, h + 1) and f(x * 2, y, h + 1)
elif x == y:
return f(x + 1, y, h + 1) and f(x + 2, y, h + 1) and f(x + 3, y, h + 1) and f(x, y + 1, h + 1) and f(x, y + 2, h + 1) and f(x, y + 3, h + 1)
a = set()
for x in range(1, 23):
if f(17, x, 0) == 1:
print(x)
break
Ответ: 9.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в большую кучу любое количество камней от одного до трёх или удвоить количество камней в меньшей куче. Если кучи содержат равное количество камней, можно добавить в любую из них от одного до трёх камней, удвоение в этой ситуации запрещено.
Игра завершается, когда общее количество камней в кучах становится
Известно, что Петя смог выиграть первым ходом. Какое наименьшее число камней могло быть суммарно в двух кучах?
Приведём решение на языке Python.
def f(x, y, h):
if h == 1 and x + y >= 41:
return 1
if h == 1 and x + y < 41:
return 0
if h < 1 and x + y >= 41:
return 0
else:
if h % 2 == 0:
if x > y:
return f(x + 1, y, h + 1) or f(x + 2, y, h + 1) or f(x + 3, y, h + 1) or f(x, y * 2, h + 1)
elif x < y:
return f(x, y + 1, h + 1) or f(x, y + 2, h + 1) or f(x, y + 3, h + 1) or f(x * 2, y, h + 1)
elif x == y:
return f(x + 1, y, h + 1) or f(x + 2, y, h + 1) or f(x + 3, y, h + 1) or f(x, y + 1, h + 1) or f(x, y + 2, h + 1) or f(x, y + 3, h + 1)
else:
if x > y:
return f(x + 1, y, h + 1) or f(x + 2, y, h + 1) or f(x + 3, y, h + 1) or f(x, y * 2, h + 1)
elif x < y:
return f(x, y + 1, h + 1) or f(x, y + 2, h + 1) or f(x, y + 3, h + 1) or f(x * 2, y, h + 1)
elif x == y:
return f(x + 1, y, h + 1) or f(x + 2, y, h + 1) or f(x + 3, y, h + 1) or f(x, y + 1, h + 1) or f(x, y + 2, h + 1) or f(x, y + 3, h + 1)
a = set()
for x in range(1, 20):
for y in range(1, 20):
if f(x, y, 0) == 1:
a.add(x + y)
print(min(a))
Ответ: 28.
В игре, описанной
Укажите минимальное и максимальное из таких
В ответе запишите сначала минимальное значение, затем максимальное.
Ответ:
Приведём решение на языке Python.
def f(x, y, h):
if h == 3 and x + y >= 41:
return 1
if h == 3 and x + y < 41:
return 0
if h < 3 and x + y >= 41:
return 0
else:
if h % 2 == 0:
if x > y:
return f(x + 1, y, h + 1) or f(x + 2, y, h + 1) or f(x + 3, y, h + 1) or f(x, y * 2, h + 1)
elif x < y:
return f(x, y + 1, h + 1) or f(x, y + 2, h + 1) or f(x, y + 3, h + 1) or f(x * 2, y, h + 1)
elif x == y:
return f(x + 1, y, h + 1) or f(x + 2, y, h + 1) or f(x + 3, y, h + 1) or f(x, y + 1, h + 1) or f(x, y + 2, h + 1) or f(x, y + 3, h + 1)
else:
if x > y:
return f(x + 1, y, h + 1) and f(x + 2, y, h + 1) and f(x + 3, y, h + 1) and f(x, y * 2, h + 1)
elif x < y:
return f(x, y + 1, h + 1) and f(x, y + 2, h + 1) and f(x, y + 3, h + 1) and f(x * 2, y, h + 1)
elif x == y:
return f(x + 1, y, h + 1) and f(x + 2, y, h + 1) and f(x + 3, y, h + 1) and f(x, y + 1, h + 1) and f(x, y + 2, h + 1) and f(x, y + 3, h + 1)
a = set()
for x in range(1, 35):
if f(5, x, 0) == 1:
a.add(x)
print(min(a), max(a))
Ответ: 20 29.
В игре, описанной в задании 19, в начальный момент в первой куче было
Найдите такое
Приведём другое решение на языке Python.
def f(x, y, h):
if (h == 2 or h == 4) and x + y >= 47:
return 1
if h == 4 and x + y < 47:
return 0
if (h == 1 or h == 3) and x + y >= 47:
return 0
else:
if h % 2 != 0:
if x > y:
return f(x + 1, y, h + 1) or f(x + 2, y, h + 1) or f(x + 3, y, h + 1) or f(x, y * 2, h + 1)
elif x < y:
return f(x, y + 1, h + 1) or f(x, y + 2, h + 1) or f(x, y + 3, h + 1) or f(x * 2, y, h + 1)
elif x == y:
return f(x + 1, y, h + 1) or f(x + 2, y, h + 1) or f(x + 3, y, h + 1) or f(x, y + 1, h + 1) or f(x, y + 2, h + 1) or f(x, y + 3, h + 1)
else:
if x > y:
return f(x + 1, y, h + 1) and f(x + 2, y, h + 1) and f(x + 3, y, h + 1) and f(x, y * 2, h + 1)
elif x < y:
return f(x, y + 1, h + 1) and f(x, y + 2, h + 1) and f(x, y + 3, h + 1) and f(x * 2, y, h + 1)
elif x == y:
return f(x + 1, y, h + 1) and f(x + 2, y, h + 1) and f(x + 3, y, h + 1) and f(x, y + 1, h + 1) and f(x, y + 2, h + 1) and f(x, y + 3, h + 1)
a = set()
for x in range(1, 24):
if f(22, x, 0) == 1:
print(x)
break
Ответ: 10.
Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней. Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может добавить в большую кучу любое количество камней от одного до трёх или удвоить количество камней в меньшей куче. Если кучи содержат равное количество камней, можно добавить в любую из них от одного до трёх камней, удвоение в этой ситуации запрещено.
Игра завершается, когда общее количество камней в кучах становится
Известно, что Петя смог выиграть первым ходом. Какое наименьшее число камней могло быть суммарно в двух кучах?
Приведём решение на языке Python.
def f(x, y, h):
if h == 1 and x + y >= 47:
return 1
if h == 1 and x + y < 47:
return 0
if h < 1 and x + y >= 47:
return 0
else:
if h % 2 == 0:
if x > y:
return f(x + 1, y, h + 1) or f(x + 2, y, h + 1) or f(x + 3, y, h + 1) or f(x, y * 2, h + 1)
elif x < y:
return f(x, y + 1, h + 1) or f(x, y + 2, h + 1) or f(x, y + 3, h + 1) or f(x * 2, y, h + 1)
elif x == y:
return f(x + 1, y, h + 1) or f(x + 2, y, h + 1) or f(x + 3, y, h + 1) or f(x, y + 1, h + 1) or f(x, y + 2, h + 1) or f(x, y + 3, h + 1)
else:
if x > y:
return f(x + 1, y, h + 1) or f(x + 2, y, h + 1) or f(x + 3, y, h + 1) or f(x, y * 2, h + 1)
elif x < y:
return f(x, y + 1, h + 1) or f(x, y + 2, h + 1) or f(x, y + 3, h + 1) or f(x * 2, y, h + 1)
elif x == y:
return f(x + 1, y, h + 1) or f(x + 2, y, h + 1) or f(x + 3, y, h + 1) or f(x, y + 1, h + 1) or f(x, y + 2, h + 1) or f(x, y + 3, h + 1)
a = set()
for x in range(1, 23):
for y in range(1, 23):
if f(x, y, 0) == 1:
a.add(x + y)
print(min(a))
Ответ: 32.
Приведём решение Эдуарда Сердюк на языке Python.
s = set()
for i in range(23):
for j in range(23):
pair = [i+1, j+1]
x, y = min(pair), max(pair)
if x < y:
s1 = 2*x + y
s2 = y+3 + x
else:
s1 = 2*x + y
s2 = 0
if s1>46 or s2>46:
s.add(x+y)
print(min(s))
В игре, описанной в задании 19, в начальный момент в первой куче было
Укажите минимальное и максимальное из таких значений S, при которых Петя не может выиграть первым ходом, но у Пети есть выигрышная стратегия, позволяющая ему выиграть вторым ходом при любой игре Вани. В ответе запишите сначала минимальное значение, затем максимальное.
Ответ:
Приведём другое решение на языке Python.
def f(x, y, h):
if h == 3 and x + y >= 47:
return 1
if h == 3 and x + y < 47:
return 0
if h < 3 and x + y >= 47:
return 0
else:
if h % 2 == 0:
if x > y:
return f(x + 1, y, h + 1) or f(x + 2, y, h + 1) or f(x + 3, y, h + 1) or f(x, y * 2, h + 1)
elif x < y:
return f(x, y + 1, h + 1) or f(x, y + 2, h + 1) or f(x, y + 3, h + 1) or f(x * 2, y, h + 1)
elif x == y:
return f(x + 1, y, h + 1) or f(x + 2, y, h + 1) or f(x + 3, y, h + 1) or f(x, y + 1, h + 1) or f(x, y + 2, h + 1) or f(x, y + 3, h + 1)
else:
if x > y:
return f(x + 1, y, h + 1) and f(x + 2, y, h + 1) and f(x + 3, y, h + 1) and f(x, y * 2, h + 1)
elif x < y:
return f(x, y + 1, h + 1) and f(x, y + 2, h + 1) and f(x, y + 3, h + 1) and f(x * 2, y, h + 1)
elif x == y:
return f(x + 1, y, h + 1) and f(x + 2, y, h + 1) and f(x + 3, y, h + 1) and f(x, y + 1, h + 1) and f(x, y + 2, h + 1) and f(x, y + 3, h + 1)
a = set()
for x in range(1, 42):
if f(5, x, 0) == 1:
a.add(x)
print(min(a), max(a))
Ответ: 26 35.
Наверх

