Исполнитель Редактор получает на вход строку цифр и преобразует её.
Редактор может выполнять две команды, в обеих
А) заменить (v, w).
Эта команда заменяет в строке первое слева вхождение
Если в строке нет вхождений
Б) нашлось (v).
Эта команда проверяет, встречается ли цепочка v в строке исполнителя
Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка исполнителя при этом не изменяется.
Цикл
ПОКА условие
последовательность команд
КОНЕЦ ПОКА
выполняется, пока условие истинно.
Дана программа для редактора:
НАЧАЛО
ПОКА НЕ нашлось (00)
заменить (011, 20)
заменить (022, 10)
заменить (01, 220)
заменить (02, 110)
КОНЕЦ ПОКА
КОНЕЦ
Известно, что исходная
Какое наименьшее количество двоек может быть в строке B?
Заметим, что после первой замены останется
c1*0 + c2*1 + c3*0 + c4*2 == 40.
Для двоек должно работать условие:
c1*1 + c2*0 + c3*2 + c4*0 > 50.
По условию задачи
2*c2 + c4 == 2*c1 + c3.
Составим программу, которая перебирает все варианты строки, и найдем минимум.
Приведём решение на языке Python.
mini = 1000
for c1 in range(0,30):
for c2 in range(0,30):
for c3 in range(0,30):
for c4 in range(0,30):
if (c1*0 + c2*1 + c3*0 + c4*2 == 40 and c1*1 + c2*0 + c3*2 + c4*0 > 50 and 2*c2 + c4 == 2*c1 + c3):
if (c1*1 + c2*0 + c3*2 + c4*0) < mini:
mini = c1*1 + c2*0 + c3*2 + c4*0
print(mini)
Ответ: 52.
Приведём решение Елизаветы Князевой на языке Python.
from random import shuffle
m = []
for n in range(2, 100, 2):
for i in range(1, 100):
a = list('1'*(n//2)+'2'*(n//2))
shuffle(a)
a = ''.join(a)
s = '0'+a+'0'
while not ('00' in s):
s = s.replace('011', '20', 1)
s = s.replace('022', '10', 1)
s = s.replace('01', '220', 1)
s = s.replace('02', '110', 1)
if s.count('1')==40 and s.count('2')>50:
m.append(s.count('2'))
print(min(m))

