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

Два иг­ро­ка, Петя и Ваня, иг­ра­ют в сле­ду­ю­щую игру. Перед иг­ро­ка­ми лежат две кучи кам­ней. Иг­ро­ки ходят по оче­ре­ди, пер­вый ход де­ла­ет Петя. За один ход игрок может до­ба­вить в мень­шую кучу любое ко­ли­че­ство кам­ней от од­но­го до ко­ли­че­ства кам­ней в этой куче. Из­ме­нять ко­ли­че­ство кам­ней в боль­шей куче не раз­ре­ша­ет­ся. Если кучи со­дер­жат рав­ное ко­ли­че­ство кам­ней, до­бав­лять камни можно в любую из них. Пусть, на­при­мер, в на­ча­ле игры в пер­вой куче 3 камня, а во вто­рой  — 5 кам­ней, будем обо­зна­чать такую по­зи­цию (3, 5). Петя пер­вым ходом дол­жен до­ба­вить в первую кучу от 1 до 3 кам­ней, он может по­лу­чить по­зи­ции (4, 5), (5, 5) и (6, 5). Если Петя создаёт по­зи­цию (4, 5), то Ваня своим ходом может до­ба­вить от 1 до 4 кам­ней в первую кучу, а если Петя создаёт по­зи­цию (6, 5), то Ваня может до­ба­вить от 1 до 5 кам­ней во вто­рую кучу, так как те­перь она стала мень­шей. В по­зи­ции (5, 5) Ваня может до­ба­вить от 1 до 5 кам­ней в любую кучу.

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

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

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

Ре­ше­ние.

Пусть S  — сумма кам­ней в обеих кучах. Такая си­ту­а­ция воз­мож­на при S  =  31, при этом в одной из куч долж­но быть 16 кам­ней, а во вто­рой  — 15. До­ба­вив ещё 15 кам­ней в мень­шую кучу, по­лу­ча­ет­ся по­зи­ция (16, 30), ко­то­рая в сумме даёт 46 кам­ней, и Петя по­беж­да­ет. При S < 31 Петя не смо­жет вы­иг­рать пер­вым ходом.

 

Ответ: 31.

 

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

def f(a,b,m):

if a+b >= 46:

return m%2==0

if m==0:

return 0

h = []

if a <= b:

for i in range(1,a+1):

h.append(f(a+i,b,m-1))

else:

for i in range(1,b+1):

h.append(f(a,b+i,m-1))

if (m-1)%2==0:

return any(h)

else:

return all(h)

print('19)', min([s1 + s2 for s1 in range(1,46) for s2 in range(1,46) if f(s1,s2,1)]))

print('20)', min([s2 for s2 in range(1,41) if not f(5,s2,1) and f(5,s2,3)]))

print('20)', max([s2 for s2 in range(1,41) if not f(5,s2,1) and f(5,s2,3)]))

print('21)', min([s2 for s2 in range(1,41) if not f(5,s2,2) and f(5,s2,4)]))

 

При­ведём ре­ше­ние Юрия Кра­силь­ни­ко­ва на языке Python.

def ход(номер,лимит,по­зи­ция):

игрок=2-номер%2

враг=3-игрок

if sum(по­зи­ция)>=46: return враг

if номер>лимит: return 0

куча1,куча2=по­зи­ция

if куча1<куча2: по­зи­ции=[(куча1+до­бав­ка,куча2) for до­бав­ка in range(1,куча1+1)]

else: по­зи­ции=[(куча1,куча2+до­бав­ка) for до­бав­ка in range(1,куча2+1)]

ре­зуль­та­ты=[ход(номер+1,лимит,поз) for поз in по­зи­ции]

if any(рез==игрок for рез in ре­зуль­та­ты): return игрок

if all(рез==враг for рез in ре­зуль­та­ты): return враг

return 0

print('#19:',min([куча1+куча2 for куча1 in range(1,44) for куча2 in range(1,44) if ход(1,1,(куча1,куча2))==1]))

print('#20:',*[куча2 for куча2 in range(1,41) if ход(1,1,(5,куча2))==0 and ход(1,3,(5,куча2))==1])

print('#20:',*[куча2 for куча2 in range(1,41) if ход(1,2,(5,куча2))==0 and ход(1,4,(5,куча2))==2])

 

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

def f(x,y,n):

if x+y >= 46 and n==1:

return 1

if x+y < 46 and n==1:

return 0

if x+y >= 46 and n%2==0:

return 0

if x+y < 46 and n%2==1:

a=[]

if x < y:

for i in range(1,x+1): a.append(f(x+i, y, n+1))

else:

for i in range(1,y+1): a.append(f(x, y+i, n+1))

return all(a)

if x+y < 46 and n%2==0:

a=[]

if x < y:

for i in range(1,x+1): a.append(f(x+i, y, n+1))

else:

for i in range(1,y+1): a.append(f(x, y+i, n+1))

return any(a)

mn = 46

for x in range(1,46):

for y in range(1,46):

if f(x, y, 0): mn=min(mn, x+y)

print(mn)

 

При­ведём ре­ше­ние Мар­га­ри­ты Фаль­ко на языке Python.

def g(s1, s2, p, end):

if s1 + s2 > 45: return p in end

if p > max(end): return False

moves1 = [g(s1+i, s2, p+1, end) for i in range(1, s1+1) if s1 <= s2]

moves2 = [g(s1, s2+i, p+1, end) for i in range(1, s2+1) if s2 <= s1]

moves = moves1 + moves2

return any(moves) if ((p+1) % 2) == (end[0] % 2) else all(moves)

print('За­да­ние 19:', min([s1+s2 for s1 in range(1,44) for s2 in range(1,44) if g(s1, s2, 0, [1])]))

res_20 = [s1 for s1 in range(1,44) if g(s1, 5, 0, [1, 3]) and not g(s1, 5, 0, [1])]

print('За­да­ние 20:', min(res_20), max(res_20))

print('За­да­ние 21:', min([s1 for s1 in range(1,40) if g(s1, 5, 0, [2, 4]) and not g(s1, 5, 0, [2])]))


Аналоги к заданию № 56519: 56547 Все

1
Тип 20 № 56520
i

В игре, опи­сан­ной в за­да­нии 19, в на­чаль­ный мо­мент в пер­вой куче было 5 кам­ней, а во вто­рой  — S кам­ней, 1 ≤ S ≤ 40. Ука­жи­те ми­ни­маль­ное и мак­си­маль­ное из таких зна­че­ний S, при ко­то­рых Петя не может вы­иг­рать пер­вым ходом, но у Пети есть вы­иг­рыш­ная стра­те­гия, поз­во­ля­ю­щая ему вы­иг­рать вто­рым ходом при любой игре Вани.

В от­ве­те за­пи­ши­те сна­ча­ла ми­ни­маль­ное зна­че­ние, затем мак­си­маль­ное.


Аналоги к заданию № 56520: 56548 Все


2
Тип 21 № 56521
i

В игре, опи­сан­ной в за­да­нии 19, в на­чаль­ный мо­мент в пер­вой куче было 5 кам­ней, а во вто­рой  — S кам­ней, 1 ≤ S ≤ 40.

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


Аналоги к заданию № 56521: 56549 Все