Олимпиада по информатике 9–11 классы — муниципальный этап ВсОШ 2023/2024: задания и ответы
Официальный комплект муниципального этапа Всероссийской олимпиады школьников по информатике для 9–11 классов (2023/2024 учебный год). Задания и решения с критериями оценивания — скачайте PDF или прорешайте онлайн по тексту ниже.
Задания — текст для прорешивания
Текст извлечён из официального PDF автоматически: формулы, таблицы и рисунки могут отображаться неточно — сверяйтесь с документом выше.
Муниципальный этап всероссийской олимпиады школьников по информатике, 9–11 классы Москва, 10 декабря 2023
Задача 1. Ферзь
Чтобы набрать 40 баллов достаточно написать решение, перебирающее все клетки, на которые можно поставить ферзя. Затем нужно посчитать количество клеток, которые бьёт этот ферзь. Для этого также переберём все оставшиеся клетки доски, и проверим, находятся ли они в одной горизонтали, вертикали или диагонали с выбранной клеткой. Запомним наибольшее количество клеток, которое может бить ферзь. Сложность такого решения будет O(n2 m2 ). В примере такого решения строки и столбцы доски нумеруются для удобства с нуля. n = int ( input ( ) ) m = int ( input ( ) ) ans = 0 f o r x in range ( n ) : fo r y in range (m) : count = 0 fo r xx in range ( n ) : f o r yy in range (m) : i f x==xx or y==yy or x−xx==y−yy or x−xx==yy−y : count += 1 ans = max( ans , count − 1 ) print ( ans ) Чтобы набрать 80 баллов, нужно уменьшить сложность решения до O(nm). Для этого можно находить количество клеток, которые бьёт ферзь, без цикла, то есть за O(1). Или, наоборот, заметить, что ферзя нужно поставить в центр доски, и найти циклами количество клеток, которые он бьёт. Пример второго решения, где ферзь ставится в клетку с координатами (bn/2c, bm/2c). n = int ( input ( ) ) m = int ( input ( ) ) x = n // 2 y = m // 2 count = 0 f o r xx in range ( n ) : fo r yy in range (m) : i f x==xx or y==yy or x−xx==y−yy or x−xx==yy−y : count += 1 print ( count − 1 ) Полное решение имеет сложность O(1). Здесь нужно заметить, что ферзь контролирует наибольшее количество клеток, находясь в центре доски, и посчитать их количество, без использования циклов. Пусть n ⩽ m, то есть доска “вытянута” по горизонтали, иначе поменяем значения n и m. Тогда в одной горизонтали с ферзём находятся m−1 клетка, а в одной вертикали — n−1 клетка. Диагонали, проходящие через ферзя, также могут содержать не более n клеток (поэтому в каждой из них не более n − 1 клетки, за вычетом клетки, в которой стоит ферзь), поэтому ответ будет равен (m − 1) + 3 · (n − 1). Но есть одно исключение: на квадратной доске, сторона которой имеет чётную длину, одна из диагоналей будет короче на одну клетку. Это, например, случай доски 8 × 8 (первый пример из условия), для которой ответ равен 27, а не 28. Почему так происходит, можно видеть на рисунке.
Страница 1 из 10
Муниципальный этап всероссийской олимпиады школьников по информатике, 9–11 классы Москва, 10 декабря 2023
В этом случае просто вычтем 1 из ответа. Пример такого решения. n = int ( input ( ) ) m = int ( input ( ) ) i f n > m: n , m = m, n ans = 3 ∗ n + m − 4 i f n % 2 == 0 and m == n : ans −= 1 print ( ans )
Задача 2. Рамка для рисунка
Начнём с переборных решений, набирающих частичные баллы. Пусть n1 и n2 — количество палочек длины 1 и 2 соответственно. 40 баллов можно набрать, если перебирать две стороны прямоугольника a и b. Проверим, можно ли сложить из имеющихся палочек прямоугольник a × b. Должны выполняться два условия: общая длина всех палочек n1 + 2n2 должна быть не меньше периметра прямоугольника, равного 2a + 2b, и каждая сторона нечётной длины должна содержать хотя бы одну палочку длины 1, поэтому значение n1 должно быть не меньше количества нечётных чисел среди сторон a, b, a, b. Пример такого решения. n1 = int ( input ( ) ) n2 = int ( input ( ) ) max_side = ( n1 + 2 ∗ n2 ) // 2 ans = 0 f o r a in range ( 1 , max_side + 1 ) : fo r b in range ( 1 , max_side + 1 ) : i f n1 + 2 ∗ n2 >= 2 ∗ a + 2 ∗ b and n1 >= 2 ∗ ( a % 2 + b % 2 ) : ans = max( ans , a ∗ b ) print ( ans ) Чтобы набрать 60 баллов нужно перебирать только одну сторону, а не две. Пусть это сторона a. 2 Максимальное значение одной стороны, как и в предыдущем решении, равно b n1 +2n c (целочислен2 ное частное от деления суммы длин всех палочек на 2). Тогда у нас будет две стороны длины a. Проверим условие, что n1 не меньше, чем 2(a mod 2), то есть если a — нечётное, то найдётся хотя бы две палочки длины 1.
Страница 2 из 10
Муниципальный этап всероссийской олимпиады школьников по информатике, 9–11 классы Москва, 10 декабря 2023 Теперь определим наибольшее подходящее значение b для данного значения a. Для этого посчитаем длину оставшихся палочек n1 + 2n2 − 2a и поделим её на 2. При этом могло оказаться, что n1 < 2(a mod 2 + b mod 2), то есть значение n1 оказалось меньше, чем число нечётных чисел среди значений a, b, a, b, то нам не хватит палочек длины 1 для того, чтобы собрать нечётные отрезки длины a, b, a, b. Но ранее мы проверили, что нам хватает палочек длины 1 для того, чтобы собрать только отрезки a и a, поэтому это возможно только в случае нечётного b. В этом случае уменьшим значение b на 1. Так мы определяем наибольшее значение второй стороны b для ранее выбранной стороны a. Запомним наибольшее из значений площадей прямоугольников a × b. n1 = int ( input ( ) ) n2 = int ( input ( ) ) max_side = ( n1 + 2 ∗ n2 ) // 2 ans = 0 f o r a in range ( 1 , max_side + 1 ) : i f n1 < 2 ∗ ( a % 2 ) : continue b = ( n1 + 2 ∗ n2 − 2 ∗ a ) // 2 i f n1 < 2 ∗ ( a % 2 + b % 2 ) : b −= 1 ans = max( ans , a ∗ b ) print ( ans ) Чтобы написать полное решение, нужно избавится и от перебора всех возможных значений одной стороны. Нужно заметить, что среди всех прямоугольников с одинаковым периметром максимальная площадь будет у квадрата или у прямоугольника, стороны которого различаются на 1. Действительно, пусть прямоугольник имеет стороны a × b, при этом a + 1 < b. Рассмотрим прямоугольник (a + 1) × (b − 1) с таким же периметром. Его площадь будет равна ab + b − a − 1, то есть больше площади ab. Поэтому для максимизации периметра в качестве значения одной из сторон нужно выбрать 14 от максимально возможного периметра. Для этого в качестве значения минимальной стороны a возь2 мём значение b n1 +2n c, а значение b подберём наибольшее подходящее значение, как в предыдущем 4 решении. Но если значение a оказалось нечётным, то для формирования сторон длины a понадобится минимум 2 палочки длины 1, и, возможно, нам не хватит палочек длины 1 для достижения максимально возможного значения b. Поэтому необходимо рассмотреть как чётное, так и нечётное 2 2 значение a, то есть нужно взять не только a = b n1 +2n c, но и значение на 1 меньше — a = b n1 +2n c, 4 4 так как одно из них будет чётным. Для каждого из этих значений a выберем подходящее b и найдём наибольшее значение a × b. Пример такого решения. n1 = int ( input ( ) ) n2 = int ( input ( ) ) ans = 0 s i d e = ( n1 + 2 ∗ n2 ) // 4 f o r a in range ( s i d e − 1 , s i d e + 1 ) : i f n1 < 2 ∗ ( a % 2 ) : continue b = ( n1 + 2 ∗ n2 − 2 ∗ a ) // 2 i f n1 < 2 ∗ ( a % 2 + b % 2 ) : b −= 1 ans = max( ans , a ∗ b ) print ( ans ) Есть и другие способы решения задачи. Например, можно попробовать конструктивно построить Страница 3 из 10
Муниципальный этап всероссийской олимпиады школьников по информатике, 9–11 классы Москва, 10 декабря 2023 решение так, чтобы две стороны прямоугольника a×b оказались максимально большими и при этом близки друг к другу. Для этого сначала разложим палочки длины 2 поровну на все стороны. У нас останется 0, 1, 2 или 3 палочки длины 2. Если осталось хотя бы две палочки длины 2, то увеличим на 2 длины двух сторон a. Если после этого осталась хотя бы одна палочка длины 2 и ещё одна палочка длины 2 или две палочки длины 1, то также можно сторону b увеличить на 2. Иначе попробуем используя палочки длины 1 выровнять длины сторон. После выравнивания длин сторон все оставшиеся палочки длины 1 разложим поровну по всем сторонам. После этого останется не более трёх палочек длины 1, если их две или три — то можно длины двух сторон увеличить на 1. Сложность реализации такого решения в том, что нужно аккуратно рассмотреть все случаи, не пропустив ни одного. n1 = int ( input ( ) ) n2 = int ( input ( ) ) a = 2 ∗ ( n2 // 4 ) b = 2 ∗ ( n2 // 4 ) n2 %= 4 i f n2 >= 2 : n2 −= 2 a += 2 i f n2 == 1 and n1 >= 2 : b += 2 n2 = 0 n1 −= 2 while a < b and n1 >= 2 : a += 1 n1 −= 2 while a > b and n1 >= 2 : b += 1 n1 −= 2 a += n1 // 4 b += n1 // 4 n1 %= 4 i f n1 >= 2 : a += 1 print ( a ∗ b )
Задача 3. Телефонный справочник
Обозначим через s — исходную строку, n — её длину, а a — мощность алфавита, то есть количество возможных символов. Для английского алфавита a = 26. У этой задачи есть много разных идей решения. Начнём с самой простой — будем перебирать пары символов i < j двумя вложенными циклами и менять символы строки si и sj местами. Можно дополнительно проверять, что si > sj , то есть при перестановке символов строка станет меньше в лексикографическом порядке. Из всех полученных таким образом строк выберем минимальную. Такое решение имеет сложность O(n3 ), так как пар символов O(n2 ), а сравнение строк выполняется за O(n). s = input ( ) ans = s f o r i in range ( len ( s ) ) : fo r j in range ( i + 1 , len ( s ) ) : if s [ i ] > s [ j ]: s1 = s [ : i ] + s [ j ] + s [ i + 1 : j ] + s [ i ] + s [ j + 1 : ] Страница 4 из 10
Муниципальный этап всероссийской олимпиады школьников по информатике, 9–11 классы Москва, 10 декабря 2023
print ( ans )
i f s 1 < ans : ans = s 1
Можно улучшить это решение, если не сравнивать строки явно и даже не строить строку с ответом. Для этого заметим, что пусть у нас есть несколько способов выполнить перестановку двух символов. Например, в строке “ccddaabb” мы можем поменять одну из букв “c” или “d” с одной из букв “a” или “b”. Пусть есть два способа это сделать, например, поменять символ si1 и sj1 или поменять si2 и sj2 . Первый способ даст меньшую строку, если i1 меньше i2 , то есть мы уменьшим тот символ, который стоит раньше. Если i1 = i2 , то первый способ будет меньше, если sj1 < sj2 , то есть на место первого заменяемого символа ставится меньший символ. В случае равенства символов первый способ будет меньше при j1 > j2 , т.к. второй участвующий в обмене символ увеличивается, и мы должны выбрать его как можно позже. Например, для строки “ccddaabb” наилучшим будет ответ “acddacbb”. Поэтому для построения решения сложности O(n2 ) можно перебирать пары переставляемых символов i и j и запоминать такую пару, которая даст лучший ответ (c минимальным значением i, при равенстве — c минимальным значением sj , при равенстве — с максимальным значением j). Пример такого решения. В этом решении в переменной ans хранится тройка чисел (i, sj , −j). Перед значением j поставили знак минус, потому что кортежи сравниваются в лексикографическом порядке, а нам необходимо, чтобы при минимальных i и sj был выбран тот ответ, у которого значение j будет больше, поэтому мы будем хранить −j. Запомним наименьший из всех подходящих кортежей, потом выведем ответ, переставив два символа, если был найден подходящий ответ. s = input ( ) ans = ( len ( s ) , ’ ’ , 0 ) f o r i in range ( len ( s ) ) : fo r j in range ( i + 1 , len ( s ) ) : if s [ i ] > s [ j ]: ans = min( ans , ( i , s [ j ] , −j ) ) i f ans [ 0 ] != len ( s ) : i = ans [ 0 ] j = −ans [ 2 ] s = s [ : i ] + s [ j ] + s [ i + 1: j ] + s [ i ] + s [ j + 1 : ] print ( s ) Для дальнейшего улучшения этого решения заметим, что если рассматриваем символ sj , который мы хотим поменять с каким-то предыдущим символом, то можно рассматривать не все символы si , а только самые первые вхождения какой-либо буквы, например, самое первое вхождение буквы “z”, самое первое вхождение буквы “y” и т.д. Запомним для каждой буквы алфавита от “a” до ”z” её первое вхождение. Затем переберём символы sj , которые мы рассматриваем, как правый символ из двух переставляемых. Но в качестве левого символа si будем рассматривать не все символы, а только первые вхождения тех символов, значение которых больше, чем sj . В примере решение ниже это цикл по переменной c. Идея выбора наилучшего ответа аналогично предыдущему решению. Такое решение имеет сложность O(an). s = input ( ) n = len ( s ) f i r s t = [ n ] ∗ 26 f o r i in range ( len ( s ) ) : c = ord ( s [ i ] ) − ord ( ’ a ’ ) i f f i r s t [ c ] == n : first [c] = i ans = ( n , ’ ’ , 0 ) f o r j in range ( n ) : Страница 5 из 10
Муниципальный этап всероссийской олимпиады школьников по информатике, 9–11 классы Москва, 10 декабря 2023 fo r c in range ( ord ( s [ j ] ) − ord ( ’ a ’ ) + 1 , 2 6 ) : i = first [c] if i < j : ans = min( ans , ( i , s [ j ] , −j ) ) i f ans [ 0 ] != n : i = ans [ 0 ] j = −ans [ 2 ] s = s [ : i ] + s [ j ] + s [ i + 1: j ] + s [ i ] + s [ j + 1 : ] print ( s ) Следующим шагом будет запоминание не только первого вхождения каждого символа, но и последнего вхождения, потому что для каждой пары символов c и d, где c > d нужно переставлять первое вхождение c с последним вхождением d. После нахождения первой и последней позиции (первый цикл) переберём все пары символов c > d и рассмотрим ответ, который получается перестановкой первого вхождения c (переменная i) и последнего вхождения d (переменная j). Такое решение будет иметь сложность O(n + a2 ), и оно уже набирает 100 баллов. s = input ( ) n = len ( s ) f i r s t = [ n ] ∗ 26 l a s t = [ −1] ∗ 26 f o r i in range ( len ( s ) ) : c = ord ( s [ i ] ) − ord ( ’ a ’ ) i f f i r s t [ c ] == n : first [c] = i last [ c ] = i ans = ( n , ’ ’ , 0 ) f o r c in range ( 2 6 ) : i = first [c] fo r d in range ( c ) : j = last [d] if i < j : ans = min( ans , ( i , d , −j ) ) i f ans [ 0 ] != n : i = ans [ 0 ] j = −ans [ 2 ] s = s [ : i ] + s [ j ] + s [ i + 1: j ] + s [ i ] + s [ j + 1 : ] print ( s ) Есть и решение сложности O(n), то есть не зависящее от мощности алфавита. Для этого поймём, как будет устроена строка, которую нельзя уменьшить перестановкой двух символов. В такой строке символы будут идти в порядке неубывания, например, “aaacdddfffkkkm”. Пропустим префикс строки, состоящий из неубывающих символов. Пусть после этого мы встретили символ, который меньше предыдущего, например, после символа “m” пусть идёт символ “h”. Этот символ можно переставить вперёд, при этом мы найдём самый первый символ, с которым его можно переставить. Это будет первый символ на префиксе, который больше его, то есть в этом примере это будет первое вхождение “k”. Найти этот символ мы можем обратным циклом, в котором индекс символа будет уменьшаться. Запомним эти символы в ответе. Если дальше мы встретим такой же символ, то, поскольку он будет позже, нужно обновить позицию второго символа в ответе. А если мы встретим меньший символ, то мы сможем переставить его с символом, который находится раньше первого запомненного символа. В этом случае опять
Страница 6 из 10
Муниципальный этап всероссийской олимпиады школьников по информатике, 9–11 классы Москва, 10 декабря 2023 запустим цикл, идущий к началу строки, в поисках первого символа, который больше данного. Пример такого решения. s = input ( ) i = 0 while i < len ( s ) − 1 and s [ i ] <= s [ i + 1 ] : i += 1 ans_i = i ans_j = i ans_c = s [ i ] f o r j in range ( i + 1 , len ( s ) ) : i f s [ j ] == ans_c : ans_j = j e l i f s [ j ] < ans_c : ans_c = s [ j ] ans_j = j while ans_i > 0 and s [ ans_i − 1 ] > ans_c : ans_i −= 1 i f ans_i != ans_j : s = s [ : ans_i ] + s [ ans_j ] + s [ ans_i + 1 : ans_j ] + s [ ans_i ] + s [ ans_j + 1 : ] print ( s )
Задача 4. Задачи на печать!
Будем рассматривать задачи последовательно, определяя, в каком режиме должна быть напечатана очередная задача. Например, если в задаче 2 страницы, то её условие должно быть напечатана только в двустороннем режиме. А если в задаче 1 страница, то всё зависит от того, в каком режиме была напечатана предыдущая страница. Если это был односторонний режим, то мы расширим предыдущий диапазон печати на новую задачу, а если двусторонний — то эту одну страницу можно напечатать в двустороннем режиме, однако, следующая страница обязательно должна стать началом нового диапазона печати, который может быть как односторонним, так и двусторонним. Заведём переменную mode, в которой будет храниться текущий режим печати — 1 для односторонней печати и 2 для двусторонней. Значение 0 означает, что очередная страница должна стать началом нового диапазона печати, который может быть любым. В переменной ans хранится общее число диапазонов печати. В переменной p хранится количество страниц в текущей задаче. Далее нужно аккуратно разобрать все случаи. Если p = 2 то мы обязательно переходим в режим 2, при этом если ранее режим был другим, то к ответу прибавляем 1. Если p = 1, то в режиме 1 не нужно делать ничего, в режиме 2 эта страница печатается в двустороннем режиме, но нужно перейти в режим 0 для начала нового диапазона со следующей страницы (потому что на обороте этой страницы ничего нельзя печатать), а в режиме 0 нужно перейти в режим 1, начав новый диапазон, то есть добавив к ответу 1. Наконец, разберём случай p = 3. Если до этого был режим 1, то мы печатаем одну страницу односторонней печатью, а ещё две страницы — двусторонней, поэтому нужно перейти в режим 2. Если мы были в режиме 2, то все три страницы можно напечатать в двустороннем режиме, потом нужно перейти в режим 0, потому что придётся начать новый диапазон. Аналогично поступим, когда режим был равен 0 — начнём новый двусторонний режим, напечатаем три страницы, а затем придётся начать новый диапазон, то есть в этом случае нужно просто увеличить значение ans на 1, сохранив значение mode равным 0. Пример такого решения. ans = 0 mode = 0 n = int ( input ( ) ) f o r i in range ( n ) : p = int ( input ( ) ) Страница 7 из 10
Муниципальный этап всероссийской олимпиады школьников по информатике, 9–11 классы Москва, 10 декабря 2023 i f p == 1 : i f mode == 2 : mode = 0 e l i f mode == 0 : mode = 1 ans += 1 i f p == 2 : i f mode != 2 : ans += 1 mode = 2 i f p == 3 : i f mode == 1 : mode = 2 ans += 1 e l i f mode == 2 : mode = 0 else : ans += 1 print ( ans ) Частичные решения можно получить используя полный перебор вариантов. Задачу можно решить и динамическим программированием, в котором целевой функцией f (i) будет количество диапазонов, необходимое для печати первых i задач. При этом придется ввести и второй параметр, аналогичный по смыслу переменной mode.
Задача 5. Вечер кёрлинга
Будем говорить о матчах, как об отрезках на прямой, у которых левый конец — момент начала матча, правый конец — момент окончания матча. Также будем говорить о том, что два отрезка не пересекаются, если левый конец одного отрезка не меньше правого конца другого отрезка. Концы могут и совпадать, но это допускается в условии этой задачи. Без условия о наличии перерыва эта задача решается при помощи жадного алгоритма. Отсортируем все отрезки по правому концу, и будем перебирать их в порядке неубывания правого конца. Если левый конец очередного рассматриваемого отрезка не меньше, чем правый конец последнего выбранного отрезка, то добавляем отрезок в множество выбранных. То есть мы выбираем очередной отрезок, как отрезок с минимальным правым концом, который не пересекается с последним ранее выбранным отрезком. Заметим, что этот алгоритм также находит способ выбрать i отрезков так, чтобы они попарно не пересекались, а правый конец последнего выбранного отрезка был как можно меньше. Если этот алгоритм применить ещё раз, но только от конца к началу, то можно решить задачу “с конца”: для каждого i мы найдём способ выбрать i отрезков так, чтобы они не пересекались и начало первого из них был как можно больше. Теперь научимся обрабатывать перерыв. Для этого будем перебирать количество матчей, которые Василиса просмотрит до перерыва. Мы уже нашли минимальное время, за которое Василиса может просмотреть эти матчи. Добавим к этому времени продолжительность перерыва. Затем, используя ранее найденные значения, найдём какое максимальное количество матчей можно просмотреть за оставшееся время. Для этого будем использовать метод двух указателей: если какому-то количеству i матчей, которые Василиса просмотрит до перерыва, соответствует j матчей, которые можно просмотреть после перерыва, то при увеличении i значение j будет уменьшаться. Поэтому сложность такого алгоритма после сортировки будет O(n), а вместе с сортировкой — O(n log n). n = int ( input ( ) ) t = int ( input ( ) ) games = [ ] f o r i in range ( 1 , n + 1 ) : Страница 8 из 10
Муниципальный этап всероссийской олимпиады школьников по информатике, 9–11 классы Москва, 10 декабря 2023 l , r = map( int , input ( ) . s p l i t ( ) ) games . append ( [ i , l , r ] ) games_sorted_end = sorted ( games , key = lambda elem : elem [ 2 ] ) min_end_time = [ 0 ] min_end_game = [ 0 ] prev_game = [ 0 ] ∗ ( n + 1 ) f o r i , l , r in games_sorted_end : i f l >= min_end_time [ − 1 ] : prev_game [ i ] = min_end_game [ −1] min_end_time . append ( r ) min_end_game . append ( i ) INF = 2 ∗ 10∗∗9 games_sorted_beg = sorted ( games , key = lambda elem : elem [ 1 ] , r e v e r s e=True ) max_begin_time = [ INF ] max_begin_game = [ 0 ] next_game = [ 0 ] ∗ ( n + 1 ) f o r i , l , r in games_sorted_beg : i f r <= max_begin_time [ − 1 ] : next_game [ i ] = max_begin_game [ −1] max_begin_time . append ( l ) max_begin_game . append ( i ) ans_m = −1 game_before_break = 0 game_after_break = 0 j = len ( max_begin_time ) − 1 f o r i in range ( 1 , len ( min_end_time ) ) : while max_begin_time [ j ] − min_end_time [ i ] < t : j −= 1 i f j > 0 and i + j > ans_m : ans_m = i + j game_before_break = min_end_game [ i ] game_after_break = max_begin_game [ j ] print (ans_m) i f ans_m > 0 : ans = [ ] c u r r = game_before_break while c u r r : ans . append ( c u r r ) c u r r = prev_game [ c u r r ] ans = ans [ : : − 1 ] c u r r = game_after_break while c u r r : ans . append ( c u r r ) c u r r = next_game [ c u r r ] print ( "␣" . j o i n (map( str , ans ) ) ) Возможные частичные неэффективные решения могут использовать перебор или динамическое программирование. В решении с перебором при n ⩽ 15 нужно отсортировать все матчи, зачем перебрать 2n под-
Страница 9 из 10
Муниципальный этап всероссийской олимпиады школьников по информатике, 9–11 классы Москва, 10 декабря 2023 множеств выбранных матчей и проверить, что они удовлетворяют условию непересечения матчей и наличия перерыва, затем выбрать подходящее подмножество, содержащее наибольшее число элементов. В решении динамическим программированием можно рассмотреть целевую функцию f (k, b) — минимальное время, за которое можно просмотреть k матчей. Значение b будет равно 0 или 1 и означает отсутствие или наличие перерыва в выбранной последовательности из k матчей. Такое решение будет иметь сложность O(n2 ).
Страница 10 из 10
Ответы и решения — показать
Официальные ответы и критерии оценивания жюри. Сначала решите задания самостоятельно.
Муниципальный этап всероссийской олимпиады школьников по информатике, 7–8 классы Москва, 10 декабря 2023
Задача 1. Абстрактный плакат Для оформления фасада музея абстрактного искусства необходимо изготовить плакат, на котором изображено несколько красных линий. На рисунке изображён плакат и нарисована система координат.
Для рисования плаката у вас есть устройство, которое умеет рисовать границы прямоугольников, заданных координатами двух противоположных углов. Одна команда для устройства состоит из четырёх чисел. Первые два числа являются координатами x1 и y1 одного угла прямоугольника, следующие два числа являются координатами x2 и y2 противоположного угла прямоугольника. При этом x1 6= x2 и y1 6= y2 . Нарисованные прямоугольники могут иметь общие углы и общие стороны, как целиком, так и частично. В одной строке записывается одна команда — четыре числа x1 , y1 , x2 , y2 через пробел. Например, для рисования такого плаката
Страница 1 из 9
Муниципальный этап всероссийской олимпиады школьников по информатике, 7–8 классы Москва, 10 декабря 2023
достаточно двух команд устройства. Один из возможных вариантов решения для этого примера: 1 1 5 2 3 1 4 4 Запишите набор команд, необходимый для рисования данного плаката, содержащий минимальное число команд. Чем меньше команд будет в вашем алгоритме, тем больше баллов вы получите. Для удобства решения задачи вы можете скачать файл для редактора электронных таблиц, содержащий данное изображение. Скачать файл в формате Microsoft Excel. Скачать файл в формате Libre Office Calc.
Страница 2 из 9
Муниципальный этап всероссийской олимпиады школьников по информатике, 7–8 классы Москва, 10 декабря 2023
Задача 2. Максимальный поток Дана сеть из нескольких труб, которые соединяются между собой в узлах, обозначенных буквами от «A» до «I». Для каждой трубы задана пропускная способность этой трубы (числа, написанные на трубах) — максимальный объём воды, который может пройти через эту трубу за единицу времени. Вода может течь по трубе в любом направлении.
Вам необходимо организовать передачу максимального объёма воды из узла «A» (исток) в узел «I» (сток). Укажите, по каким трубам в каком направлении и в каком объёме необходимо организовать подачу воды. Ваша схема должна удовлетворять следующим условиям. 1. Объём воды, который протекает по трубе, не должен превышать пропускной способности этой трубы. 2. По каждой трубе вода течёт в одном направлении. 3. Для всех вершин, кроме истока «A» и стока «I», объём втекающей в узел воды должен быть равен объёму вытекающей из узла воды. Чем больше будет пропускная способность вашей схемы (объём воды, передаваемый из «A» в «I» за единицу времени), тем больше баллов вы получите. В ответе запишите несколько строк. Каждая строка должна содержать сначала две буквы, потом число. Две буквы должны быть концами одной трубы. Вода течёт по трубе из узла, обозначенного первой буквой, в узел, обозначенный второй буквой. Число обозначает объём воды, который протекает по этой трубе за единицу времени. Например, запись A B 5 обозначает, что по трубе из узла «A» в узел «B» будет протекать 5 единиц объёма воды в единицу времени.
Страница 3 из 9
Муниципальный этап всероссийской олимпиады школьников по информатике, 7–8 классы Москва, 10 декабря 2023
Задача 3. Телефонный справочник Саша недавно начала регистрировать компанию по разработке чат-ботов и уже подала необходимые документы. Но добрые люди рассказали Саше, что в телефонном справочнике компании располагаются в лексикографическом (алфавитном) порядке их названий. Что такое телефонный справочник, Саша не знает, но решила учесть рекомендации и поменять название своей компании, чтобы оно было как можно раньше в телефонном справочнике. Поскольку Саша уже подала документы, она не может полностью поменять название компании, но может сказать, что допустила опечатку, и поменять любые две буквы в названии местами. Помогите Саше выбрать новое название компании. Вам предлагается 4 варианта названия: 1. cfwvfu 2. tbzttbetcb 3. aefhfifjfkflzhz 4. abcdfjhklmnqrtuvwzyx Для каждого из этих названий предложите другое название, которое можно получить из этого перестановкой каких-то двух не обязательно соседних букв и которое при этом является минимально возможным в лексикографическом порядке. Напомним, что из двух слов в лексикографическом порядке одно будет меньше другого, если у этих слов есть какая-то общая совпадающая начальная часть (возможно, пустая), а следующий символ одного слова идёт в алфавите раньше, чем следующий символ другого слова. Если вы забыли английский алфавит, запустите приложение для работы с электронными таблицами и посмотрите на обозначения столбцов таблицы. Запишите ответы для каждого из четырёх названий, каждый ответ — в отдельной строке. В каждой строке должны быть только английские буквы, номер задания указывать не нужно. В вашем ответе должно быть ровно 4 строки. Если вы не можете дать ответ на какое-то задание, напишите любую строку из английских букв, например, “a”.
Страница 4 из 9
Муниципальный этап всероссийской олимпиады школьников по информатике, 7–8 классы Москва, 10 декабря 2023
Задача 4. Большая команда Для участия в городском школьном турнире по кёрлингу необходимо пригласить K команд. Команда должна состоять из учащихся одной школы, при этом от одной школы могут принять участие несколько команд. Организаторы решили для популяризации игры внести изменения в правила игры — все команды могут состоять не обязательно из четырёх участников, но размеры команд должны быть равны. Это позволит привлечь к игре больше школьников. Теперь перед организаторами стоит сложная задача — необходимо определить такое максимальное значение S, чтобы из всех школ города можно было собрать K команд, в каждой из которых было бы S участников из одной школы. Например, если в какой-то школе имеется 500 учащихся и размер команды S равен 20, то из этой школы смогут принять участие 25 команд, а если взять S равным 21, то возможно собрать только 23 команды из этой школы. Дано количество обучающихся в каждой школе города и количество команд K, которое необходимо собрать. Вы должны определить максимально возможный размер команды для этих данных. Данные для этой задачи находятся в документе электронной таблицы. Скачать таблицу в формате Microsoft Exсel. Скачать таблицу в формате Libre Office Calc. В этой таблице четыре листа, на каждом листе находится отдельный набор данных, для которого вам необходимо выполнить задание. На каждом листе в столбце A записаны количества учащихся во всех школах города, а в ячейке C2 записано значение K для этого набора — количество команд, которое необходимо пригласить для участия в турнире. Запишите в ответе четыре целых числа, являющиеся ответами на задание для каждого листа таблицы, в порядке следования листов в таблице. Каждое число пишите в отдельной строке. Вы должны записать ровно 4 числа, если вы не можете дать ответ на какое-то задание, напишите любое число.
Страница 5 из 9
Муниципальный этап всероссийской олимпиады школьников по информатике, 7–8 классы Москва, 10 декабря 2023
Задача 5. Ферзь Ограничение по времени:
0.5 секунд
Пётр любит шахматы и математику. Он знает, что самая мощная фигура в шахматах — это ферзь, потому что он ходит и как ладья, на все клетки на одной с ним вертикали или горизонтали, и как слон, на все клетки по диагоналям. Ферзя можно поставить на доску 8 × 8 так, чтобы он контролировал (то есть мог переместиться в эти клетки за один ход) целых 27 клеток доски! Петра заинтересовало, какое максимальное количество клеток может контролировать ферзь на прямоугольных досках самых разных размеров. Помогите ему в решении этой задачи.
Формат входных данных Первая строка входных данных содержит целое число n (1 ⩽ n ⩽ 109 ) — размер доски по вертикали. Вторая строка входных данных содержит целое число m (1 ⩽ m ⩽ 109 ) — размер доски по горизонтали.
Формат выходных данных Программа должна вывести одно целое число — максимальное количество клеток, которое может контролировать ферзь на доске n × m. Обратите внимание на то, что ответ в этой задаче может превышать возможное значение 32-битной целочисленной переменной, поэтому необходимо использовать 64битные целочисленные типы данных (тип long long в языке C++, тип int64 в Pascal, тип long в Java и C#).
Система оценки Решения, правильно работающие, когда n и m не превоcходят 10, будут оцениваться в 40 баллов. Решения, правильно работающие, когда n и m не превоcходят 500, будут оцениваться в 80 баллов.
Примеры стандартный ввод
стандартный вывод
8 8
27
3 4
Замечание Второй пример из условия приведён на рисунке. Крестиками обозначены клетки, которые контролирует ферзь.
Страница 6 из 9
Муниципальный этап всероссийской олимпиады школьников по информатике, 7–8 классы Москва, 10 декабря 2023
Задача 6. Рамка для рисунка Ограничение по времени:
1 секунда
У Алексея есть набор, который состоит из n палочек длины 1 и m палочек длины 2. Палочки можно соединять между собой, либо выстраивая их в линию, либо под прямым углом. Алексей хочет собрать из имеющихся палочек рамку прямоугольной формы, чтобы потом вставить в эту рамку лист бумаги и нарисовать красивый пейзаж для мамы на Новый год. При этом Алексей считает, что чем больше будет площадь прямоугольника, тем значимей будет его подарок. Поэтому ему важно определить максимальную площадь прямоугольника, границу которого можно собрать из имеющихся палочек.
Формат входных данных Первая строка входных данных содержит целое число n — количество палочек длины 1, 0 ⩽ n ⩽ 109 . Вторая строка входных данных содержит целое число m — количество палочек длины 2, 0 ⩽ m ⩽ 109 .
Формат выходных данных В единственной строке выведите единственное целое число — максимальную площадь прямоугольника, который можно сложить из имеющихся палочек. Если из имеющихся палочек невозможно сложить никакой прямоугольник, то выведите число 0. Обратите внимание на то, что ответ в этой задаче может превышать возможное значение 32-битной целочисленной переменной, поэтому необходимо использовать 64битные целочисленные типы данных (тип long long в языке C++, тип int64 в Pascal, тип long в Java и C#).
Система оценки Решения, правильно работающие, когда n и m не превосходят 20, будут оцениваться в 20 баллов. Решения, правильно работающие, когда n и m не превосходят 1000, будут оцениваться в 40 баллов. Решения, правильно работающие, когда n и m не превосходят 5 · 105 , будут оцениваться в 60 баллов.
Примеры стандартный ввод
стандартный вывод
5 0
4 3
3 0
Замечание В первом примере есть 5 палочек длины 1. Из них можно сложить квадрат со стороной 1, его площадь равна 1, при этом одна палочка останется. Во втором примере есть 4 палочки длины 1 и 3 палочки длины 2. Из них можно сложить прямоугольник размера 2 × 3. В третьем примере есть 3 палочки длины 1, из них невозможно сложить прямоугольник.
Страница 7 из 9
Муниципальный этап всероссийской олимпиады школьников по информатике, 7–8 классы Москва, 10 декабря 2023
Задача 7. Задачи на печать! Ограничение по времени:
1 секунда
Олимпиады бывают не только личные, но и командные. В командной олимпиаде по программированию обычно принимают участие команды из трёх человек, которым предоставляется один компьютер и один комплект условий задач, причём задач обычно существенно больше, чем в личных олимпиадах. Условие каждой из задач помещается на одной, двух или трёх страницах. При этом условие может быть напечатано на двух сторонах одного листа, но для удобства команд на одном листе может располагаться условие только одной из задач. Для экономии бумаги, если условие задачи занимает две страницы, оно должно быть напечатано на двух сторонах одного листа, а если из трёх страниц — на двух сторонах одного листа и на одной стороне другого листа, вторая сторона которого останется чистой. При этом можно напечатать первую страницу такой задачи отдельно на чистом листе, а оставшиеся две страницы — на одном листе или, наоборот, первые две страницы распечатать на одном листе, а третью — на чистом листе. Задачи и все их страницы печатаются последовательно. Условия всех задач распечатываются на принтере в виде нескольких последовательных заданий. Для каждого задания необходимо задать диапазон печати: номера первой и последней страниц, которые будут напечатаны в этом задании (будут напечатаны все страницы в этом диапазоне), а также тип печати — односторонняя или двусторонняя. Вам необходимо минимизировать количество заданий для печати условий.
Формат входных данных Первая строка входных данных содержит целое число n (1 ⩽ n ⩽ 105 ) — количество задач в олимпиаде. Следующие n строк содержат по одному целому числу xi (1 ⩽ xi ⩽ 3) — количество страниц в i-й задаче.
Формат выходных данных Выведите единственное число — минимальное количество последовательных диапазонов, каждый из которых можно напечатать одной командой односторонней или двусторонней печати так, что условия всех задач будут напечатаны в удобном для командной олимпиады виде.
Система оценки Решения, верно работающие, когда все значения xi отличны от 1, будут оцениваться не менее чем в 30 баллов. Решения, верно работающие, когда все значения xi отличны от 2, будут оцениваться не менее чем в 30 баллов. Решения, верно работающие, когда все значения xi отличны от 3, будут оцениваться не менее чем в 30 баллов. Решения, верно работающие, когда n ⩽ 10, будут оцениваться не менее чем в 50 баллов. Решения, верно работающие, когда n ⩽ 1000, будут оцениваться не менее чем в 80 баллов.
Примеры стандартный ввод
стандартный вывод
4 1 3 2 1
2 3 3
Страница 8 из 9
Муниципальный этап всероссийской олимпиады школьников по информатике, 7–8 классы Москва, 10 декабря 2023
Замечание В первом примере на олимпиаду предложены 4 задачи, условия которых состоят из 1, 3, 2 и 1 страниц соответственно. Всего необходимо распечатать 7 страниц. Их можно распечатать за два задания: cтраницы 1–2 — односторонней печатью (это единственная страница первой задачи и первая из трёх страниц второй задачи), оставшиеся страницы 3–7 — двусторонней. Во втором примере на олимпиаду предложены 2 задачи, условия которых состоят из 3 страниц каждая. Всего необходимо распечатать 6 страниц. Их можно распечатать за два задания: cтраницы 1–1 — односторонней печатью (это первая из трёх страниц первой задачи), оставшиеся страницы 2–6 — двусторонней. При этом в первой задаче первая страница будет напечатана на одной стороне, потому что она напечатана односторонней печатью, а во второй задаче последняя страница будет напечатана на одной стороне, потому что в этом задании нечётное число страниц печатается на двух сторонах, поэтому вторая сторона этого листа будет пустой.
Страница 9 из 9