Муниципальный этап, 7–8 классы всероссийской олимпиады по информатике: 7 задач с официальным разбором, к 3 из них наше решение на C++.

К задаче 1

Муниципальный этап ВсОШ по информатике 2024/25, 7–8 классы.

Задачи тура

Отмечайте решённые: 0 из 7

1. Порядок во всём

жадный алгоритм, строки

Вася очень порядочный мальчик, он любит порядок во всём.

У него в тетради есть столбик натуральных чисел:

48
5
67
3
82
8
63
701
546
54

Он хочет изменить эти числа так, чтобы они шли по порядку, по неубыванию. Это значит, что каждое число должно быть меньше или равно следующего числа.

При этом Вася ничего не хочет зачёркивать, поэтому единственное, что ему остаётся, — это дописать цифры в конец этих чисел. Например, если в тетради записано число 12, то Вася может сделать из него числа 120, 121, 1200, 12999 и т. п., то есть любые числа, которые начинаются с 12, а может и оставить число 12.

Вася хочет, чтобы получившиеся числа были как можно меньше. Запишите те числа, которые у него получились.

В ответе нужно записать 10 чисел, каждое число в отдельной строке. Никаких других символов, кроме требуемых чисел, в ответе быть не должно.

Официальный разборСначала попробуйте решить сами

2. Треугольники

комбинаторика, математика

Есть клетчатая полоска шириной в 1 клетку и длиной в клеток. Внутри каждой клетки провели диагонали. Посчитайте, сколько получилось треугольников, стороны которых образованы сторонами или диагоналями клеток.

Например, для полоски длиной получатся 18 треугольников, все они изображены на рисунке.

Все 18 треугольников в полоске 1×2
Все 18 треугольников в полоске 1×2

Ответом на эту задачу является некоторое выражение, которое может содержать целые числа, переменную , операции сложения (обозначаются «+»), вычитания (обозначаются «-»), умножения (обозначаются «*»), деления (обозначаются «/») и круглые скобки. Запись вида 2n для обозначения произведения числа 2 и переменной некорректна, нужно писать 2 * n.

Ваше выражение должно давать правильный ответ для любого натурального .

Пример правильной формы записи ответа:

n * (2 * n - 8)

Официальный разборСначала попробуйте решить сами

3. Электронное табло

математика, конструктив

Электронное табло состоит из двух цифровых разрядов, то есть с его помощью можно отображать двузначные числа от 00 до 99 (однозначные числа дополняются слева нулём). Табло можно управлять при помощи трёх кнопок.

Нажатие на кнопку «+» увеличивает число на табло на 1. Если на табло уже горело число 99, то оно не меняется.

Нажатие на кнопку «−» уменьшает число на табло на 1. Если на табло уже горело число 00, то оно не меняется.

Нажатие на кнопку «∗» меняет две цифры на табло местами. Например, если на табло горело число 53, то после нажатия на «∗» там будет гореть число 35.

Первоначально на табло горит число 00. Найдите самую короткую последовательность нажатий кнопок, которая получает из числа 00 следующие числа:

1. 23;

2. 38;

3. 65;

4. 84;

5. 99.

В ответе запишите пять строк: последовательности нажатий, необходимых для получения каждого из данных чисел из числа 00. Каждая строка ответа должна состоять только из символов «+», «−», «∗». Чем короче будет ваша последовательность, тем больше баллов вы получите. Если вы не можете дать ответ на какое-нибудь задание, напишите любую непустую последовательность, удовлетворяющую условию, например «+».

Официальный разборСначала попробуйте решить сами

4. 90 минут

электронные таблицы, моделирование

В московском транспорте можно оплачивать проезд при помощи тарифа «Кошелёк» карты «Тройка». Есть два вида тарифа:

  • «Единый» (57 рублей) — одна поездка на любом виде транспорта;
  • «90 минут» (85 рублей) — не более одной поездки на метро и любое количество поездок на наземном транспорте в течение не более 90 минут с момента начала первой поездки (между началом поездки и началом первой поездки по тарифу «90 минут» должно пройти не более 90 минут).

Смена тарифа происходит автоматически: при первой поездке списывается 57 рублей, и если следующая поездка была совершена в течение 90 минут, причём это не повторная поездка на метро, то с кошелька списывается 28 рублей (в сумме получается 85 рублей) и карта переключается на тариф «90 минут». Последующие поездки, удовлетворяющие условиям тарифа «90 минут», будут бесплатными. Если очередная поездка будет повторной поездкой на метро или с момента первой поездки прошло более 90 минут, то с карты будет списано 57 рублей по тарифу «Единый», затем, возможно, карта опять переключится на тариф «90 минут» и т. д.

Таким образом, каждая поездка может приводить к списанию 57 рублей (тариф «Единый»), 28 рублей (переключение на тариф «90 минут») или 0 рублей (бесплатная поездка по тарифу «90 минут»).

Вам дана информация о 1000 совершённых поездках. Определите сумму списания с карты при каждой поездке.

Данные для выполнения этого задания содержатся в электронной таблице. Вы можете скачать файл с данными в одном из двух форматов: Microsoft Excel (XLSX) или LibreOffice Calc (ODS).

Для выполнения задания вы можете использовать электронные таблицы из офисного пакета или любые другие средства вашего компьютера.

Столбец A электронной таблицы содержит время поездки в формате h:mm, то есть сначала количество часов, а после двоеточия — двузначное число минут. Время отсчитывается от некоторого условного момента, и значение часов может превышать 24.

Столбец B содержит одну букву — вид поездки. Буква M (английская) обозначает поездку на метро, буква A (английская) обозначает поездку на наземном транспорте.

Вы должны определить сумму списания с карты при совершении каждой из данных поездок. Полученные 1000 чисел запишите в отдельном столбце электронной таблицы. Выделите этот столбец, скопируйте в буфер обмена и вставьте в поле для ввода ответа.

Ваш ответ будет принят на проверку, если он будет содержать 1000 строк и в каждой строке будет только одно число.

Рассмотрим пример. Пусть дана следующая таблица с информацией о поездках.

   A     B
1  0:20  A
2  0:40  M
3  1:40  A
4  2:00  A
5  2:20  A
6  2:30  M
7  2:50  M
8  4:20  A

Тогда ответ будет таким:

57
28
0
57
28
0
57
28

Первая поездка на наземном транспорте стоит 57 рублей, при второй поездке на метро билет переключится на тариф «90 минут», и с карты спишется 28 рублей, поэтому третья поездка на наземном транспорте будет бесплатной. Четвёртая поездка на наземном транспорте произойдёт по тарифу «Единый», потому что разница между временем этой поездки (2:00) и временем первой поездки по тарифу «90 минут» (0:20) больше 90 минут. При пятой поездке на наземном транспорте произойдёт переключение на тариф «90 минут», шестая поездка на метро будет бесплатной, седьмая поездка на метро будет по тарифу «Единый», потому что в тарифе «90 минут» уже была поездка на метро. Восьмая поездка на наземном транспорте пройдёт по тарифу «90 минут», потому что разница времён 4:20 и 2:50 составляет ровно 90 минут.

Официальный разборСначала попробуйте решить сами

5. Очень большая кольцевая линия

0.5 секунд, 256 мегабайт, математика

В Москве построили новую кольцевую линию метро. Она столь большая, что станции на ней не имеют названий, а имеют только номера. Всего на линии станций, они пронумерованы числами от 1 до по кругу, и за станцией номер идёт станция номер 1.

Новая линия проходит мимо дома Тани и её школы. Таня живёт на станции номер , а школа находится на станции номер . Определите, сколько времени понадобится Тане на дорогу на метро, если между двумя соседними станциями поезд движется 1 минуту (временем стоянки поезда следует пренебречь). На поезде можно передвигаться в любом из двух направлений кольцевой линии.

Формат входных данных

Первая строка входных данных содержит число — количество станций на линии (). Вторая строка содержит номер станции , где живёт Таня (). Третья строка содержит номер станции , где находится школа ().

Формат выходных данных

Программа должна вывести одно целое число.

Система оценки

Решения, правильно работающие, когда , будут оцениваться в 60 баллов.

Замечание

В первом примере на дорогу понадобится 2 минуты: 7 – 6 – 5. Во втором примере на дорогу понадобится 3 минуты: 8 – 9 – 1 – 2.

стандартный вводстандартный вывод
10
7
5
2
стандартный вводстандартный вывод
9
8
2
3
Официальный разборСначала попробуйте решить сами
Наше решение на C++Полный код на C++17

6. Речные прогулки

0.5 секунд, 256 мегабайт, математика, бинарный поиск

Вдоль течения реки размещены пристаней, пронумерованных числами от 1 до . Пристань номер 1 находится выше всех остальных по течению реки, пристань номер находится в устье реки, расстояние между соседними пристанями равно 1 км.

Для развития туризма решено открыть два прогулочных речных маршрута. Маршруты будут начинаться на одной из промежуточных пристаней (пристани номер 1 или не могут быть начальными точками маршрутов), один маршрут будет идти вверх по течению реки к пристани номер 1, другой маршрут будет идти вниз по течению к пристани номер . Промежуточных остановок на маршрутах нет.

Для подъёма вверх по течению реки судно тратит минут на один километр, а для спуска вниз по течению реки — минут на один километр. Определите, на какой пристани должны начинаться оба маршрута, чтобы их продолжительности различались как можно меньше. Это значит, что необходимо минимизировать модуль разности времени в пути двух маршрутов.

Формат входных данных

Первая строка входных данных содержит целое число () — общее количество пристаней на маршруте. Вторая строка содержит число — время подъёма судна на один километр вверх по течению реки, третья строка содержит число — время спуска на один километр вниз по течению, .

Формат выходных данных

Программа должна вывести одно число — номер пристани, на которой необходимо организовать начальный пункт маршрутов. Если возможных подходящих ответов несколько, можно вывести любой из них.

Система оценки

Решения, правильно работающие, когда все входные числа не превосходят 100, будут оцениваться в 60 баллов.

Замечание

В примере из условия начальным пунктом маршрутов нужно сделать пристань 3. Тогда вверх по течению судно поднимется за минут, а вниз по течению реки спустится за минут. Разница в продолжительности маршрутов составит 1, меньшей разности в данном примере достичь невозможно.

стандартный вводстандартный вывод
8
7
3
3
Официальный разборСначала попробуйте решить сами
Наше решение на C++Полный код на C++17

7. Благоустройство

1 секунда, 256 мегабайт, жадный алгоритм

Рядом с Очень большой кольцевой линией построили новую дорогу, вдоль которой необходимо сделать благоустройство и посадить деревья. Городские службы определили места, в которых возможно посадить деревья, но биологи говорят, что расстояние между деревьями должно быть не менее чем метров. Определите, где нужно посадить деревья, чтобы расстояние между деревьями было не менее метров, а число посаженных деревьев было максимальным.

Введём на улице координатную прямую с единицей, равной 1 метру. Тогда возможная позиция для -го дерева имеет координату , а расстояние между двумя деревьями с координатами и равно .

Формат входных данных

В первой строке входных данных записано число — минимальное допустимое расстояние между деревьями, . Во второй строке записано количество возможных мест посадки деревьев , . Следующие строк содержат различных чисел () — возможные координаты деревьев в порядке возрастания.

Формат выходных данных

Программа должна вывести в порядке возрастания координаты тех точек, в которых необходимо посадить деревья. Если возможных решений задачи несколько, можно вывести любое из них.

Система оценки

Решения, правильно работающие, когда , и все , будут оцениваться в 20 баллов.

Решения, правильно работающие, когда , и все , будут оцениваться в 40 баллов.

Решения, правильно работающие, когда без дополнительных ограничений на и , будут оцениваться в 60 баллов.

стандартный вводстандартный вывод
3
5
2
3
6
9
10
3
6
10
Официальный разборСначала попробуйте решить сами
Наше решение на C++Полный код на C++17

Сначала решите сами

Возьмите столько времени, сколько было на олимпиаде, и только потом открывайте разбор.

Готовиться самому

Платформа с задачами

1400+ задач с автопроверкой

или
Пробное занятие

Призёр ВсОШ, первое бесплатно