P
pro·school.ru
Каталог школ
💻 ВсОШ · Муниципальный этап · 2025/2026

Олимпиада по информатике 9–11 классымуниципальный этап ВсОШ 2025/2026: задания и ответы

Официальный комплект муниципального этапа Всероссийской олимпиады школьников по информатике для 9–11 классов (2025/2026 учебный год). Задания и решения с критериями оценивания — скачайте PDF или прорешайте онлайн по тексту ниже.

Просмотр PDF: ЗаданияОткрыть в новой вкладке ↗

Задания — текст для прорешивания

Текст извлечён из официального PDF автоматически: формулы, таблицы и рисунки могут отображаться неточно — сверяйтесь с документом выше.

Муниципальный этап всероссийской олимпиады школьников по информатике (программированию) 9-11 классы, Москва, 14 декабря 2025

Задача 1. Большой квадрат Ограничение по времени:

1 секунда

Даны два прямоугольника размера a × b и c × d. Можно соединить их вместе, приложив сторону одного прямоугольника к стороне другого и склеив место соединения. Прямоугольники можно поворачивать перед склеиванием. После этого из полученной фигуры нужно вырезать квадрат со сторонами, параллельными сторонам прямоугольника. Определите максимальное возможное значение стороны квадрата. На рисунке изображены два прямоугольника со сторонами 8 × 3 и 6 × 2, из которых можно вырезать квадрат со стороной 5 (заштрихован).

Формат входных данных Программа получает на вход натуральные числа a, b, c, d, каждое в отдельной строке — стороны первого и второго прямоугольников. Все числа не превосходят 109 .

Формат выходных данных Программа должна вывести одно целое число — максимальную возможную сторону квадрата.

Пример стандартный ввод 6 2 3 8

стандартный вывод 5

Страница 1 из 8

Муниципальный этап всероссийской олимпиады школьников по информатике (программированию) 9-11 классы, Москва, 14 декабря 2025

Задача 2. План эвакуации Ограничение по времени:

1 секунда

Этаж здания представляет собой прямоугольник из n×m квадратных комнат. Из каждой комнаты есть проходы в соседние комнаты. В двух комнатах находятся лестницы. Необходимо разработать план эвакуации — указать для каждой комнаты направление движения в одну из соседних комнат так, чтобы, передвигаясь по комнатам только в указанных направлениях, можно было бы достичь одной из двух лестниц, пройдя минимальное расстояние. На рисунке изображён возможный план эвакуации для примера из условия. Комнаты с лестницами обозначены звёздочками.

Формат входных данных Первая строка входных данных содержит число n — количество строк в плане эвакуации, 1 ⩽ n ⩽ 100. Вторая строка входных данных содержит число m — количество столбцов в плане эвакуации, 2 ⩽ m ⩽ 100. Следующие две строки содержат числа r1 и c1 — номера строки и столбца комнаты, в которой находится первая лестница, 1 ⩽ r1 ⩽ n, 1 ⩽ c1 ⩽ m. Следующие две строки содержат числа r2 и c2 — номера строки и столбца комнаты, в которой находится вторая лестница, 1 ⩽ r2 ⩽ n, 1 ⩽ c2 ⩽ m. Гарантируется, что r1 ̸= r2 или c1 ̸= c2 . Строки нумеруются сверху вниз числами от 1 до n, столбцы нумеруются слева направо числами от 1 до m.

Формат выходных данных Программа должна вывести n строк, каждая строка должна содержать m символов. Каждый символ соответствует одной комнате. В двух комнатах с лестницами должен находиться символ «S» (прописная английская буква). В остальных комнатах находятся символы, указывающие направление движения: «<» (символ «меньше») — налево. «>» (символ «больше») — направо. «^» (символ находится на клавише «6») — вверх. «v» (строчная английская буква) — вниз. Никакие другие символы, например, пробелы, выводить не нужно. Вы можете вывести любой подходящий план эвакуации.

Страница 2 из 8

Муниципальный этап всероссийской олимпиады школьников по информатике (программированию) 9-11 классы, Москва, 14 декабря 2025

Пример стандартный ввод 3 5 1 2 2 4

стандартный вывод >S<v< >^>S< >^>^<

Замечание Решения, правильно работающие, когда n = 1, будут оцениваться в 20 баллов. Решения, правильно работающие, когда c1 = c2 , будут оцениваться в 20 баллов. Решения, правильно работающие, когда лестницы находятся в двух противоположных углах здания, будут оцениваться в 20 баллов.

Страница 3 из 8

Муниципальный этап всероссийской олимпиады школьников по информатике (программированию) 9-11 классы, Москва, 14 декабря 2025

Задача 3. Аркадий Аркадьевич делает грядки Ограничение по времени:

1 секунда

Аркадий Аркадьевич, широко известный в узких кругах инженер, после выхода на пенсию решил отдохнуть и заняться садоводством. Он уже купил себе участок и собирается сажать там различные овощи и фрукты. Но всем известно, что растения должны расти в грядках, поэтому сейчас Аркадий Аркадьевич занят их сооружением. Для того чтобы собрать прямоугольную грядку, нужны 4 доски. В идеале это должны быть две пары досок равной длины, тогда из них можно сложить ровный прямоугольник. Но если доски имеют неравную длину, то в одном из углов полученной грядки можно разместить пластиковый уголок: две планки длины r, скреплённые под прямым углом. Уголок со стороной r позволит увеличить длины двух досок на величину, не превосходящую r. Если противоположными сторонами грядки будут доски длины a и b, а также c и d соответственно, то для того чтобы сделать прямоугольную грядку из этих досок, понадобится уголок размера max(|a − b|, |c − d|) . Например, чтобы сделать грядку из досок длины 5, 7, 3, 2, понадобится уголок размера 2. На рисунке чёрным цветом изображены доски и красным цветом изображён уголок.

В сарае у Аркадия Аркадьевича нашлись n досок, i-я из которых имеет длину li . Теперь он хочет выбрать из них четыре и сложить из них грядку таким образом, чтобы использовать уголок наименьшего размера. Помогите ему.

Формат входных данных Первая строка входных данных содержит число n (4 ⩽ n ⩽ 105 ) — количество досок в сарае у Аркадия Аркадьевича. Следующие n строк содержат числа l1 , . . . , ln (1 ⩽ li ⩽ 109 ) — длины досок.

Формат выходных данных Программа должна сначала вывести число r — минимально возможный размер уголка. Во второй строке выведите 4 числа a, b, c, d — длины досок, которые необходимо выбрать для грядки. При этом противоположными сторонами прямоугольника будут доски a и b, а также c и d. Если есть разные варианты выбора досок для грядки с одной и той же величиной уголка, можно вывести любой из них.

Система оценки Решения, правильно работающие, когда n ⩽ 30, будут оцениваться в 20 баллов. Решения, правильно работающие, когда n ⩽ 100, будут оцениваться в 45 баллов. Решения, правильно работающие, когда n ⩽ 500, будут оцениваться в 65 баллов. Решения, правильно работающие, когда все li ⩽ 30, будут оцениваться в 10 баллов.

Страница 4 из 8

Муниципальный этап всероссийской олимпиады школьников по информатике (программированию) 9-11 классы, Москва, 14 декабря 2025

Примеры стандартный ввод

стандартный вывод

6 5 9 12 3 7 2

2 2 3 5 7

6 1 7 3 6 3 8

1 3 3 6 7

Страница 5 из 8

Муниципальный этап всероссийской олимпиады школьников по информатике (программированию) 9-11 классы, Москва, 14 декабря 2025

Задача 4. Гравитационная сортировка Ограничение по времени:

2 секунды

Алгоритм гравитационной сортировки позволяет упорядочить массив целых неотрицательных чисел. Для сортировки чисел используется набор стержней и бусинок. Рассмотрим алгоритм сортировки массива целых неотрицательных чисел [a1 , a2 , ..., an ]. Если данные числа могут достигать значения n, нужно использовать n стержней и a1 + a2 + ... + an бусинок. Наденем по одной бусинке на самые левые a1 стержней, они представляют значение a1 . Затем наденем по одной бусинке на самые левые a2 стержней, разместив их во втором ряду, над первым рядом бусинок. При этом, если a2 > a1 , то некоторые бусинки второго ряда окажутся как бы висящими в воздухе, они не будут опираться на бусинки нижнего ряда. Затем на самых левых a3 стержнях в третьем ряду разместим a3 бусинок, часть из них также может не опираться ни на какие предыдущие бусинки и т.д. После того, как все бусинки будут размещены, они начинают двигаться по стержням вниз. Когда движение завершится, количество бусинок в каждом ряду будет равно значениям упорядоченного массива. Будем считать, что все бусинки двигаются одновременно. За секунду одна бусинка сползает на один ряд вниз, если в ряду ниже пусто или находится бусинка, которая также спускается вниз. На рисунках показано начальное расположение бусинок для массива [2, 4, 1, 5, 3] и состояние через 1, 2 и 3 секунды.

Для каждого стержня определите время, необходимое для того, чтобы на этом стержне все бусинки закончили движение. В данном примере на первом стержне бусинки будут неподвижны, на втором стержне они закончат движение через одну секунду, на третьем и четвёртом стержнях — через две секунды, на пятом стержне — через три секунды.

Формат входных данных Первая строка входных данных содержит число n (1 ⩽ n ⩽ 105 ) — количество сортируемых чисел и количество стержней (то есть максимальное значение одного числа). Следующие n строк содержат по одному числу ai (0 ⩽ ai ⩽ n) — значения упорядочиваемых чисел (начальные значения числа бусинок в каждом ряду).

Страница 6 из 8

Муниципальный этап всероссийской олимпиады школьников по информатике (программированию) 9-11 классы, Москва, 14 декабря 2025

Формат выходных данных Для каждого из n стержней слева направо программа должна вывести одно число — количество секунд, через которое на данном стержне бусинки прекратят движение.

Система оценки Решения, правильно работающие при n ⩽ 10, будут оцениваться в 30 баллов. Решения, правильно работающие при n ⩽ 2000, будут оцениваться в 60 баллов.

Пример стандартный ввод 5 2 4 1 5 3

стандартный вывод 0 1 2 2 3

Страница 7 из 8

Муниципальный этап всероссийской олимпиады школьников по информатике (программированию) 9-11 классы, Москва, 14 декабря 2025

Задача 5. Шифр mint Ограничение по времени:

1 секунда

Многие старейшие шифры основаны на замене букв на числа, например, в шифре A1Z26 каждая буква заменяется на её порядковый номер в алфавите. Вдохновившись этой идеей, первоклассник Петя решил придумать свой шифр-замену. Он хочет каждую букву от «A» до «R» (первые 18 букв латинского алфавита) заменять на одно из чисел 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90. Числа выбраны так, чтобы при дешифровке легко разделить последовательность цифр на коды букв, причём весь алфавит Петя не смог использовать, ибо сотни он ещё не узнал. Если применить один из таких шифров к строке, он получит натуральное число. Если использовать разные шифры, удовлетворяющие условию, то будут получаться разные числа. Пете интересно, какое наименьшее число может быть шифром заданной строки. К сожалению, сравнивать длинные числа слишком сложная задача для первоклассника, поэтому он просит вас написать программу, шифрующую заданное слово минимальным числом.

Формат входных данных Программа получает на вход непустую строку s, состоящую из прописных букв латинского алфавита от «A» до «R», длина строки не превышает 1000 символов.

Формат выходных данных Программа должна вывести одно число — шифр строки s. Обратите внимание, число может быть длинным.

Система оценки Решения, правильно работающие, когда строка состоит не более чем из 4 символов, будут оцениваться в 20 баллов. Решения, правильно работающие, когда строка состоит из букв «A» и «B», будут оцениваться в 20 баллов. Решения, правильно работающие, когда строка состоит из букв от «A» до «I», будут оцениваться в 44 балла.

Примеры стандартный ввод

стандартный вывод

REGION

123456

OLIMPIADA

123453676

CONFIRMABLE

1012023456789

Страница 8 из 8

Ответы и решения — показать

Официальные ответы и критерии оценивания жюри. Сначала решите задания самостоятельно.

Муниципальный этап всероссийской олимпиады школьников по информатике (программированию) 9-11 классы, Москва, 14 декабря 2025

Разбор задач

Задача 1. Большой квадрат

Рассмотрим разные способы разместить квадрат внутри двух прямоугольников. Если квадрат полностью размещён внутри первого прямоугольника, то максимально возможная длина стороны равна наименьшей стороне прямоугольника min(a, b). Если он полностью размещён внутри второго прямоугольника, то min(c, d). Наконец, рассмотрим вариант, когда для вырезания квадрата понадобятся оба прямоугольника, как на картинке в условии. Пусть прямоугольники сложены так, что стороны a и c являются продолжением друг друга, а стороны b и d касаются. Тогда длина стороны квадрата не может быть больше значений a+c, b и d, и ответом будет min(a+c, b, d). Очевидно, что в этом случае нужно выбрать стороны так, чтобы a была наименьшей стороной первого прямоугольника, то есть a ⩽ b. Аналогично, c должна быть наименьшей стороной второго прямоугольника, то есть c ⩽ d. Итак, если упорядочить стороны прямоугольников, то есть сделать так, что a ⩽ b и c ⩽ d, то ответ равен max(a, c, min(a + c, b, d)). Пример такого решения. a = int ( input ( ) ) b = int ( input ( ) ) c = int ( input ( ) ) d = int ( input ( ) ) if a > b: a, b = b, a if c > d: c , d = d, c print (max( a , c , min( a + c , b , d ) ) )

Задача 2. План эвакуации

Если комната имеет координаты (r, c), то расстояние до лестницы с координатами (ri , ci ) равно |r − ri | + |c − ci | (так называемое «манхэттенское расстояние»). Посчитаем минимум расстояний от комнаты до двух лестниц. Из комнаты нужно перейти в ту из четырёх соседних комнат, для которой минимум расстояний до лестниц будет меньше, чем в этой комнате. Именно в эту комнату и направим стрелку из текущей комнаты. Задача имеет только реализационную трудность. В примере решения ниже используются вспомогательные функции. dist возвращает расстояние между двумя комнатами, а dist_to_exit — расстояние от комнаты до ближайшей лестницы. Вложенными циклами проходим по всем комнатам. Для перебора направлений переходов в соседние комнаты удобно использовать цикл, в котором переменная c — это символ, соответствующий направлению перемещения, а переменные dx и dy — это значение изменения координат при переходе в данном направлении. n = int ( input ( ) ) m = int ( input ( ) ) y1 = int ( input ( ) ) x1 = int ( input ( ) ) y2 = int ( input ( ) ) x2 = int ( input ( ) ) def d i s t ( a1 , b1 , a2 , b2 ) : return abs ( a1 − a2 ) + abs ( b1 − b2 ) def d i s t _ t o _ e x i t ( y , x ) : return min( d i s t ( y , x , y1 , x1 ) , d i s t ( y , x , y2 , x2 ) ) f o r y in range ( 1 , n + 1 ) : fo r x in range ( 1 , m + 1 ) : Страница 1 из 9

Муниципальный этап всероссийской олимпиады школьников по информатике (программированию) 9-11 классы, Москва, 14 декабря 2025 curr_dist = dist_to_exit (y , x) move = ’ S ’ fo r c , dy , dx in [ ( ’ ^ ’ , −1 ,0 ) , ( ’ v ’ , 1 , 0 ) , ( ’< ’ ,0 , −1) , ( ’> ’ , 0 , 1 ) ] : i f d i s t _ t o _ e x i t ( y + dy , x + dx ) < c u r r _ d i s t : move = c print ( move , end= ’ ’ ) print ( ) Многие участники написали решение по-другому. Для каждой комнаты сначала определим, к какому из двух выходов нужно двигаться, сравнив расстояния от комнаты до выходов. Пусть координаты рассматриваемой комнаты (r, c), а ближайший выход находится в комнате (ri , ci ). Если r < ri , нужно вывести указатель «вниз», если r > ri — указатель «вверх». Если c < ci — указатель «вправо», а если c > ci —- указатель «влево». Наконец, встречались и решения с нахождением кратчайшего маршрута при помощи алгоритма обхода графа в ширину, но в этой задаче это избыточно сложное решение.

Задача 3. Аркадий Аркадьевич делает грядки

В этой задаче нужно выбрать четыре различных элемента массива ai1 , ai2 , ai3 , ai4 так, чтобы минимизировать значение max(|ai1 − ai2 |, |ai3 − ai4 |). Наименее эффективное решение сложности O(n4 ) заключается в переборе всех четырёх сторон прямоугольника вложенными циклами. Проверим, что выбраны разные доски (то есть значения индексов элементов i1 , i2 , i3 , i4 попарно различны) и посчитаем для выбранных индексов значение размера уголка max(|ai1 − ai2 |, |ai3 − ai4 |). Запомним четвёрку элементов массива с минимальным значением размера уголка. Такое решение набирает 20 баллов, пример такого решения. n = int ( input ( ) ) a = [ int ( input ( ) ) f o r i in range ( n ) ] r = 10∗∗9 f o r i 1 in range ( n ) : fo r i 2 in range ( n ) : fo r i 3 in range ( n ) : f o r i 4 in range ( n ) : i f len ( set ( [ i 1 , i 2 , i 3 , i 4 ] ) ) == 4 : d = max( abs ( a [ i 1 ] − a [ i 2 ] ) , abs ( a [ i 3 ] − a [ i 4 ] ) ) if d < r : r = d ans = [ a [ i 1 ] , a [ i 2 ] , a [ i 3 ] , a [ i 4 ] ] print ( r ) print ( ∗ ans ) Переборное решение можно улучшить, если заметить, что четвёрку выбранных досок нужно объединять в пары так — две короткие доски вместе и две длинные вместе. Это позволит сократить перебор в 4! = 24 раза. Один раз упорядочим список всех досок, затем переберём 4 индекса i1 < i2 < i3 < i4 и рассмотрим пары досок (ai1 , ai2 ) и (ai3 , ai4 ). Пример такого решения, которое также набирает 20 баллов. n = int ( input ( ) ) a = [ int ( input ( ) ) f o r i in range ( n ) ] a . sort () r = 10∗∗9 f o r i 1 in range ( n ) : fo r i 2 in range ( i 1 + 1 , n ) : fo r i 3 in range ( i 2 + 1 , n ) : f o r i 4 in range ( i 3 + 1 , n ) : Страница 2 из 9

Муниципальный этап всероссийской олимпиады школьников по информатике (программированию) 9-11 классы, Москва, 14 декабря 2025

print ( r ) print ( ∗ ans )

d = max( a [ i 2 ] − a [ i 1 ] , a [ i 4 ] − a [ i 3 ] ) if d < r : r = d ans = [ a [ i 1 ] , a [ i 2 ] , a [ i 3 ] , a [ i 4 ] ]

Можно получить более эффективное решение, сократив перебор. Если упорядочить длины досок, то в качестве противоположных сторон грядки нужно выбирать две доски, которые идут рядом в упорядоченном массиве. То есть нужно выбрать для некоторого значения индекса i пару досок ai и ai+1 и для некоторого значения индекса j пару досок aj и aj+1 . Если перебирать два индекса i и j, то сложность алгоритма получится O(n2 ). Такое решение набирает 65 баллов. n = int ( input ( ) ) a = [ int ( input ( ) ) f o r i in range ( n ) ] a . sort () r = 10∗∗9 f o r i in range ( n ) : fo r j in range ( i +2, n −1): d = max( a [ i +1] − a [ i ] , a [ j +1] − a [ j ] ) if d < r : r = d ans = [ a [ i ] , a [ i +1] , a [ j ] , a [ j + 1 ] ] print ( r ) print ( ∗ ans ) Для перехода к полному решению заметим, что после упорядочивания массива длин досок, нам нужно выбрать две пары элементов, идущих в упорядоченном массиве рядом, с наименьшим расстоянием между ними. Переберём соседние элементы упорядоченного массива длин досок и составим другой массив m из троек: разность этих элементов и их индексы (ai+1 − ai , i, i + 1). Затем упорядочим этот массив и возьмём в нём первые два элемента, то есть две пары досок с наименьшим расстоянием. Пример такого решения. n = int ( input ( ) ) a = [ int ( input ( ) ) f o r i in range ( n ) ] a . sort () m = [] f o r i in range ( n − 1 ) : m. append ( ( a [ i +1] − a [ i ] , i , i +1)) m. s o r t ( ) print (m[ 1 ] [ 0 ] ) print ( a [m[ 0 ] [ 1 ] ] , a [m[ 0 ] [ 2 ] ] , a [m[ 1 ] [ 1 ] ] , a [m [ 1 ] [ 2 ] ] ) Это решение неправильное, оно выдаёт неверный ответ на многих тестах и набирает 55 баллов. Ошибка заключается в том, что выбранные две пары досок могут пересекаться, то есть одна доска может входить в две пары. Например, если длины досок равны 1, 2, 3, 10, то решение выберет две пары досок с минимальной разностью, это пары (2, 1) и (3, 2), при этом доска 2 вошла в обе пары. Это решение можно исправить следующим образом. После упорядочивания массива m нужно посмотреть на первые два его элемента (два минимальных элемента). Если они не имеют общей доски, то это и есть ответ. Иначе нужно рассмотреть вторую и третью минимальные пары, а также первую и третью пары. Хотя бы в одном из этих вариантов не будет пересечений, выберем эти две пары досок в качестве ответа. Пример такого решения. n = int ( input ( ) ) Страница 3 из 9

Муниципальный этап всероссийской олимпиады школьников по информатике (программированию) 9-11 классы, Москва, 14 декабря 2025 a = [ int ( input ( ) ) f o r i in range ( n ) ] a . sort () m = [] f o r i in range ( n − 1 ) : m. append ( ( a [ i +1] − a [ i ] , i , i +1)) m. s o r t ( ) i f m[ 0 ] [ 2 ] != m[ 1 ] [ 1 ] and m[ 0 ] [ 1 ] != m [ 1 ] [ 2 ] : print (m[ 1 ] [ 0 ] ) print ( a [m[ 0 ] [ 1 ] ] , a [m[ 0 ] [ 2 ] ] , a [m[ 1 ] [ 1 ] ] , a [m [ 1 ] [ 2 ] ] ) e l i f m[ 0 ] [ 2 ] != m[ 2 ] [ 1 ] and m[ 0 ] [ 1 ] != m [ 2 ] [ 2 ] : print (m[ 2 ] [ 0 ] ) print ( a [m[ 0 ] [ 1 ] ] , a [m[ 0 ] [ 2 ] ] , a [m[ 2 ] [ 1 ] ] , a [m [ 2 ] [ 2 ] ] ) else : print (m[ 2 ] [ 0 ] ) print ( a [m[ 1 ] [ 1 ] ] , a [m[ 1 ] [ 2 ] ] , a [m[ 2 ] [ 1 ] ] , a [m [ 2 ] [ 2 ] ] ) Возможны и другие способы решения. Все они используют сортировку длин досок. После сортировки можно пройти циклом, рассматривая разность двух соседних элементов. Также необходимо поддерживать минимальную разность двух соседних элементов на префиксе массива, до рассматриваемых элементов. Возьмём максимум из этих двух разностей, это есть необходимый размер уголка. Выберем наименьшее из полученных размеров уголков. Такое решение имеет сложность O(n log n), ввиду использования сортировки. n = int ( input ( ) ) a = [ int ( input ( ) ) f o r i in range ( n ) ] a . sort () r = 10∗∗9 ans = [ 0 , 0 , 0 , 0 ] min_pair = [ a [ 0 ] , a [ 1 ] ] f o r i in range ( 2 , n − 1 ) : i f max( a [ i +1] − a [ i ] , min_pair [ 1 ] − min_pair [ 0 ] ) < r : ans = min_pair + [ a [ i ] , a [ i + 1 ] ] r = max( a [ i +1] − a [ i ] , min_pair [ 1 ] − min_pair [ 0 ] ) i f a [ i ] − a [ i −1] < min_pair [ 1 ] − min_pair [ 0 ] : min_pair = [ a [ i −1] , a [ i ] ] print ( r ) print ( ∗ ans ) Можно также использовать двоичный поиск по ответу (размеру уголка). Зафиксировав размер уголка, пройдём по упорядоченному массиву досок и посчитаем, можно ли выбрать две непересекающиеся пары досок, разность длин которых не превосходит выбранный размер уголка. Пример такого решения. n = int ( input ( ) ) a = [ int ( input ( ) ) f o r i in range ( n ) ] a . sort () l = −1 r = 10∗∗9 while r − l > 1 : mid = ( l + r ) // 2 cnt = 0 i = 0 while i < n − 1 and c n t < 2 : i f a [ i +1] − a [ i ] <= mid : c n t += 1 Страница 4 из 9

Муниципальный этап всероссийской олимпиады школьников по информатике (программированию) 9-11 классы, Москва, 14 декабря 2025 i += 2 else : i += 1 i f c n t == 2 : r = mid else : l = mid print ( r ) cnt = 0 i = 0 while c n t < 2 : i f a [ i +1] − a [ i ] <= r : print ( a [ i ] , a [ i +1]) c n t += 1 i += 2 else : i += 1

Задача 4. Гравитационная сортировка

Решения, моделирующие описанный процесс сортировки, перемещая бусинки по одной, могут набрать 30 баллов. Для этого создадим двумерный массив размера n × n, отмечая в нём бусинки и свободные места разными значениями, например, 1 и 0. Переберём в цикле стержни слева направо, на каждом стержне будем передвигать бусинки вниз, начиная с самой нижней. Бусинки передвигаются, пока ниже них есть свободное место. Ответом для данного стержня является количество перемещений самой верхней бусинки на стержне. Такое решение имеет сложность O(n3 ). Пример такого решения. n = int ( input ( ) ) a = [ [ 0 ] ∗ n f o r i in range ( n ) ] f o r i in range ( n ) : k = int ( input ( ) ) fo r j in range ( k ) : a[ i ][ j ] = 1 f o r j in range ( n ) : ans = 0 fo r i in range ( n ) : if a[ i ][ j ]: a[ i ][ j ] = 0 k = i − 1 while k >= 0 and a [ k ] [ j ] == 0 : k −= 1 k += 1 a[k][ j ] = 1 ans = i − k print ( ans ) Чтобы набрать 60 баллов, необходимо понять, как получается ответ для k-го стержня. Найдём на этом стержне самую верхнюю бусинку. Номер ряда этой бусинки – это такое наибольшее i, что ai ⩾ k. Бусинка переместится вниз столько раз, сколько существует пустых мест на этом стержне в рядах ниже её, то есть это количество таких значений j, что j < i и aj < k. Если одним циклом перебирать номер стержня k, а вложенным циклом подсчитать количество таких рядов i, что ai < k,

Страница 5 из 9

Муниципальный этап всероссийской олимпиады школьников по информатике (программированию) 9-11 классы, Москва, 14 декабря 2025 при этом есть ряд с большим номером, значение которого ai > k, то такое решение будет иметь сложность O(n2 ) и получит 60 баллов. Пример такого решения. n = int ( input ( ) ) a = [ int ( input ( ) ) f o r i in range ( n ) ] f o r k in range ( 1 , n + 1 ) : ans = 0 cnt = 0 fo r i in range ( n ) : if a[ i ] < k: c n t += 1 else : ans = c n t print ( ans ) Чтобы набрать 100 баллов, нужно научиться вычислять ответ быстро, общая сложность решения должна быть O(n). Для этого не будем искать верхнюю бусинку на каждом стержне, а, наоборот, найдём ряды, в которых бусинки будут самым верхними на своих стержнях. Если в ряду находятся ai бусинок, а во всех рядах выше бусинок меньше, то есть aj < ai для всех j > i, то в ряду i некоторые бусинки будут верхними на своих стержнях. В примере из условия три бусинки из ряда i = 5 будут верхними на стержнях 1, 2, 3, а две бусинки из ряда i = 4 будут верхними на стержнях 4 и 5. Такие значения в массиве, которые больше всех предыдущих значений, называются рекордами. Все рекорды можно найти за O(n) однократным проходом по массиву. В этой задаче нужно искать рекорды с конца массива, то есть элементы, которые больше всех элементов с большими индексами. Пусть ai — рекорд. Определим, на каких стержнях бусинки в ряду i будут верхними. Если m = max aj (наибольшее число бусинок в рядах выше i), то в ряду i бусинки на стержнях с j=i+1...n

номерами m + 1, ..., aj будут верхними. При обнаружении рекорда найдём ответ для тех стержней, на которых находятся эти бусинки. Ответ для стержня k (m + 1 ⩽ k ⩽ ai ) мы уже научились считать — это количество значений aj < k, где j < i. Но нужно вычислить это значение быстро. Для этого научимся отвечать на запросы, какое количество элементов массива меньше заданного числа. Это можно сделать подсчётом — создадим массив cnt, затем пройдём циклом по массиву и увеличим cnt[elem] на 1 для каждого элемента массива elem. После выполнения этого цикла значение cnt[ i ] будет равно количеству элементов в массиве, равных i. Затем снова пройдём циклом по массиву cnt, увеличивая значение cnt[ i ] на значение предыдущего элемента cnt[ i+1]. После такого прохода значение cnt[ i ] будет равно количеству элементов массива, не превосходящих i. Тем самым число элементов массива, меньших k, будет равно cnt[k−1]. Но из этого числа нужно вычесть число рядов, находящихся выше ряда i, оно равно n − 1 − i, потому что в этих рядах число бусинок также меньше k, но эти ряды не нужно учитывать в ответе. Пример решения, набирающего 100 баллов. Сложность решения O(n). n = int ( input ( ) ) a = [ int ( input ( ) ) f o r i in range ( n ) ] cnt = [ 0 ] ∗ (n + 1) f o r elem in a : c n t [ elem ] += 1 # По д с чëт чис ла э л ементо в , р а вных i f o r i in range ( 1 , n + 1 ) : c n t [ i ] += c n t [ i − 1 ] # Тепе рь это чис ло э л ементо в , не пр е в о с хо дящих i r e c = 0 # Те кущий р е к о р д − мак симум на с уффик с е ма с сив а f o r i in range ( n − 1 , −1, −1): i f a [ i ] > rec : new_rec = a [ i ] # Но в о е знач ение р е к о р д а б у д ет a [ i ]

Страница 6 из 9

Муниципальный этап всероссийской олимпиады школьников по информатике (программированию) 9-11 классы, Москва, 14 декабря 2025 fo r k in range ( r e c + 1 , new_rec + 1 ) : print ( c n t [ k − 1 ] − ( n − 1 − i ) ) r e c = new_rec # Нужно выв е сти нули для в с е х о ста вших с я сте ржней − на них нет б у сино к f o r i in range ( r e c + 1 , n + 1 ) : print ( 0 )

Задача 5. Шифр mint

В случае, когда строка короткая, можно использовать полный перебор способов назначить числа буквам, но такое решение не очень просто пишется и не поможет придумать полное решение задачи. Переборные решения могут набрать 20 баллов. Для приближения к полному решению лучше разобрать частные случаи задачи, когда строка состоит только из букв «A» и «B» и когда строка состоит из букв от «A» до «I». Если строка состоит из букв «A» и «B», то одну из букв нужно заменить на «1», а другую — на «2». Чтобы результат был как можно меньше, нужно первую букву строки и все такие же буквы заменить на «1», а другую букву — на «2». Пример такого решения (20 баллов). s = input ( ) i f s [ 0 ] == "A" : s = s . r e p l a c e ( "A" , s = s . r e p l a c e ( "B" , else : s = s . r e p l a c e ( "B" , s = s . r e p l a c e ( "A" , print ( s )

" 1" ) " 2" ) " 1" ) " 2" )

Если строка состоит только из букв от «A» до «I», нужно использовать однозначные числа от «1» до «9», при этом чем раньше буква встречается в строке, тем меньшее число нужно использовать для этой буквы. Переберём символы строки с начала, и при появлении ранее не встреченной буквы, заменим эту букву во всей строке на минимальное неиспользованое однозначное число. Пример такого решения (44 балла). s = input ( ) d = 1 f o r i in range ( len ( s ) ) : i f "A" <= s [ i ] <= " I " : s = s . r e p l a c e ( s [ i ] , str (d ) ) d += 1 print ( s ) В полном решении используется та же идея — чем раньше стоит буква, тем меньшим числом нужно её заменить. Но числа при замене могут быть однозначными и двузначными. Чтобы полученное число была минимальным, прежде всего необходимо, чтобы оно содержало как можно меньше цифр. Поэтому часто встречающиеся буквы нужно заменять на однозначные числа, а редко встречающиеся буквы — на двузначные. Пример решения, в котором производится подсчёт числа появлений каждой буквы в строке, затем производится сортировка всех букв по частоте появления и 9 наиболее часто встречающихся букв заменяются на однозначные числа, а 9 менее часто встречающихся букв — на двузначные числа. Для определения, какое же именно число будет назначено конкретной букве, используется описанный выше жадный алгоритм (чем раньше происходит первое появление буквы, тем меньшее ей назначается число), но отдельно для однозначных и двузначных чисел. s = input ( ) c n t = {chr ( ord ( "A" ) + i ) : 0 f o r i in range ( 1 8 ) } Страница 7 из 9

Муниципальный этап всероссийской олимпиады школьников по информатике (программированию) 9-11 классы, Москва, 14 декабря 2025 f o r c in s : c n t [ c ] += 1 l e t t e r s = l i s t ( cnt . keys ( ) ) l e t t e r s . s o r t ( key = lambda c : c n t [ c ] ) one_digit = l e t t e r s [ 9 : ] min1 = 1 min2 = 10 c i p h e r = dict ( ) ans = "" f o r c in s : i f c not in c i p h e r : i f c in o n e _ d i g i t : c i p h e r [ c ] = s t r ( min1 ) min1 += 1 else : c i p h e r [ c ] = s t r ( min2 ) min2 += 10 ans += c i p h e r [ c ] print ( ans ) Это решение набирает 60 баллов, оно неверно работает в случае, когда некоторые буквы в строке встречаются одинаковое число раз, поэтому их можно будет заменить как на однозначное число, так и на двузначное. Например, в строке «ABCDEFGHIJKLMNOPQR» все буквы встречаются по одному разу, из них половина будет заменена на однозначные, а половина — на двузначные числа. Но необходимо понять, как разбить буквы на классы однозначных и двузначных чисел для последующей замены. Может возникнуть желание сделать полный перебор всех разбиений 18 букв на два подмножества по 9 букв. Число таких разбиений C918 = 48620. Для каждого разбиения необходимо также обработать всю строку, то есть общее число действий будет порядка 50 миллионов, что много для Python. Но эту задачу можно решить и без перебора. Опять вернёмся к списку всех букв, упорядоченному по частоте их появления в строке. Наиболее часто встречающихся букв отнесём к множеству букв, которые будут заменены на однозначные числа, а наиболее редко встречающиеся буквы — на двузначные числа. Возможно появление и третьей группы «неопределённых» букв. Если в упорядоченном списке буквы, стоящие на 9-м и 10-м месте имеют одинаковую частоту появления, то они, а также все буквы с такой же частотой, попадут в группу неопределённых. Им может быть назначено как однозначное, так и двузначное число. Далее так же идём по строке сначала, назначая буквам числа. Для этого нужно хранить минимальное неиспользованное однозначное и двузначное число. Буквам из множества однозначных или двузачных чисел сразу назначается минимальное число нужной длины. Для букв из группы неопределённых нужно сравнить минимальное доступное однозначное и двузначное число и выбрать то из них, у которого меньше первая цифра. Если начальные цифры равны, например, если можно выбрать число «2» или «20», то нужно выбирать двузначное. Например, для строки «ABCDEFGHIJKLMNOPQR», в которой все буквы неопределённые, ответ получится «101202303...909». Также нужно учесть, что буквам неопределённой группы можно назначить ровно определённое число однозначных и двузначных чисел, в зависимости от того, сколько букв попало в другие группы. Нужно считать, сколько осталось однозначных и двузначных чисел, доступных для назначения неопределённым буквам, и если, например, неопределёным буквам уже назначили необходимое чис-

Страница 8 из 9

Муниципальный этап всероссийской олимпиады школьников по информатике (программированию) 9-11 классы, Москва, 14 декабря 2025 ло однозначных чисел, оставшимся неопределённым буквам будут назначаться только двузначные числа и наоборот. Сложность алгоритма будет всего лишь O(n), что позволяет решить задачу на любом языке программирования. Пример такого решения. s = input ( ) c n t = {chr ( ord ( "A" ) + i ) : 0 f o r i in range ( 1 8 ) } f o r c in s : c n t [ c ] += 1 l e t t e r s = sorted ( c n t . k e y s ( ) , key=lambda c : c n t [ c ] ) m i ddl e_f req = ( c n t [ l e t t e r s [ 8 ] ] + c n t [ l e t t e r s [ 9 ] ] ) / 2 o n e _ d i g i t = { c f o r c in l e t t e r s i f c n t [ c ] > m i d d l e _ f r e q } t w o _ d i g i t s = { c f o r c in l e t t e r s i f c n t [ c ] < m i d d l e _ f r e q } c n t _ f r e e _ o n e _ d i g i t = 9 − len ( o n e _ d i g i t ) c n t _ f r e e _ t w o _ d i g i t s = 9 − len ( t w o _ d i g i t s ) min1 = 1 min2 = 10 c i p h e r = dict ( ) ans = "" f o r c in s : i f c not in c i p h e r : i f c in o n e _ d i g i t : c i p h e r [ c ] = s t r ( min1 ) min1 += 1 e l i f c in t w o _ d i g i t s : c i p h e r [ c ] = s t r ( min2 ) min2 += 10 e l i f c n t _ f r e e _ t w o _ d i g i t s==0 or c n t _ f r e e _ o n e _ d i g i t and min1<min2 / 1 0 : c i p h e r [ c ] = s t r ( min1 ) min1 += 1 c n t _ f r e e _ o n e _ d i g i t −= 1 else : c i p h e r [ c ] = s t r ( min2 ) min2 += 10 c n t _ f r e e _ t w o _ d i g i t s −= 1 ans += c i p h e r [ c ] print ( ans )

Страница 9 из 9

Теория к заданиям: информатика, 9 класс

Муниципальный этап 2025/2026 — другие классы

Все классы →

Олимпиада по информатике 9 класс — другие годы и этапы

Все комплекты →