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

К задаче 1

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

Задачи тура

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

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

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

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

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

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

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

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

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

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

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

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

Замечание

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

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

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

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

Дана клетчатая сетка, состоящая из клеток со стороной 1, в каждой клетке проведены обе диагонали.

Например, сетка выглядит следующим образом:

Сетка 1×2 с диагоналями
Сетка 1×2 с диагоналями

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

Треугольник называется хорошим, если его стороны образованы сторонами и/или диагоналями сетки и он целиком лежит в каком-то подходящем прямоугольнике.

Посчитайте количество хороших треугольников на данной сетке.

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

Программа получает на вход два числа и , записанных в отдельных строках, — размеры сетки, , .

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

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

Обратите внимание на то, что ответ в этой задаче может превышать возможное значение 32-битной целочисленной переменной, поэтому необходимо использовать 64-битные целочисленные типы данных (тип long long в языке C++, тип int64 в Pascal, тип long в Java и C#).

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

В данной задаче 20 тестов помимо тестов из условия, каждый из них оценивается в 5 баллов. При этом в 4 тестах (помимо тестов из условия) или равно 1, в 4 других тестах или равно 2.

Замечание

Все треугольники из первого примера:

Все треугольники из первого примера
Все треугольники из первого примера
стандартный вводстандартный вывод
1
1
8
стандартный вводстандартный вывод
1
2
18
стандартный вводстандартный вывод
2
2
44
стандартный вводстандартный вывод
3
5
196
Официальный разборСначала попробуйте решить сами
Наше решение на C++Полный код на C++17

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

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

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

У него в тетради есть столбик натуральных чисел, и он хочет изменить его так, чтобы числа шли по порядку, то есть по неубыванию. При этом Вася, естественно, ничего не хочет зачёркивать, поэтому единственное, что ему остаётся — это дописать цифры в конец некоторых чисел.

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

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

Первая строка входных данных содержит целое число () — количество чисел в тетрадке у Васи.

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

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

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

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

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

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

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

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

Замечание

В первом примере числа уже упорядочены, Васе не нужно ничего дописывать.

Во втором примере Васе можно приписать ко второму числу цифру 3, тогда числа станут равны 13, а значит, будут расположены по неубыванию. При этом 13 — это минимально возможное последнее число.

В третьем примере Вася может, например, получить числа 20, 25, 100. Возможны и другие варианты, но последнее число при любом способе дописывания цифр получится не меньше 100.

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

4. Тройка

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

Арсений очень любит пользоваться городским транспортом. В городе, где он живёт, существует карта «Тройка», позволяющая оплачивать проезд при помощи тарифа «Кошелёк». Есть два вида тарифа:

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

Так как Арсений коллекционирует карты «Тройка», у него их очень много, поэтому он может использовать неограниченное количество билетов одновременно.

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

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

Первая строка входных данных содержит целое число — количество поездок, которые были запланированы, .

Следующие строк содержат два значения, разделённые пробелом. Сначала указан вид транспорта: заглавная английская буква «B», если Арсений будет использовать наземный транспорт, или заглавная английская буква «M», если он воспользуется метро. Затем указано время начала поездки в формате ЧЧ:ММ (в виде двузначного количества часов и затем двузначного количества минут).

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

Также гарантируется, что разница времени совершения двух поездок составляет не менее 10 минут.

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

Программа должна вывести одно целое число — сколько денег потратит Арсений, если будет максимально эффективно использовать карты.

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

Решения, правильно работающие при , будут набирать не менее 10 баллов.

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

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

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

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

Замечание

В первом примере все три поездки могут быть оплачены одним тарифом «90 минут» за 85 рублей.

Во втором примере нужно одним билетом «90 минут» за 85 рублей оплатить первую (23:59), вторую (00:29) и четвёртую (01:29) поездки. Третью поездку (00:59) нельзя оплатить тем же билетом, потому что в тарифе «90 минут» может быть не более одной поездки на метро, для этой поездки придётся использовать отдельный билет за 57 рублей.

В третьем примере первую поездку (22:00) нужно оплатить отдельным билетом за 57 рублей, а следующие три поездки (23:00, 23:50, 00:30) — билетом «90 минут».

стандартный вводстандартный вывод
3
M 10:00
B 10:20
B 11:00
85
стандартный вводстандартный вывод
4
B 23:59
M 00:29
M 00:59
B 01:29
142
стандартный вводстандартный вывод
4
B 22:00
B 23:00
B 23:50
B 00:30
142
Официальный разборСначала попробуйте решить сами
Наше решение на C++Полный код на C++17

5. Все на съезд!

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

В 2025 году в Берляндии впервые будет проводиться трёхдневный межпланетный съезд по вопросам проведения олимпиад по информатике. Доклады съезда разбиты на 12 секций, и теперь организаторам необходимо распределить секции по дням: в каждый день будут проводиться 4 секции.

Известно, что в съезде примут участие человек. Каждый участник съезда выбрал 3 секции, которые он хочет посетить. Но поскольку в один день секции будут проводиться одновременно, каждый участник в один день может присутствовать не более чем на одной секции. Поэтому если в один день будут идти две или три секции, выбранные каким-то участником, то он всё равно сможет посетить только одну из них. Если же выбранные секции будут проходить в разные дни, участник сможет посетить их все.

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

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

Первая строка входных данных содержит целое число () — количество участников съезда.

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

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

Программа должна вывести 3 строки, в каждой из которых должны быть 4 числа через пробел — номера секций, проводимых в первый, второй и третий день съезда соответственно. Каждое из чисел от 1 до 12 должно встречаться в выводе ровно один раз. Если возможных оптимальных расписаний несколько, можно вывести любое из них.

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

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

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

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

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

Замечание

В примере из условия расписание составлено так, что второй и третий участник посетят все желаемые секции, а первый — две секции (5 и одну из секций 1, 6). Таким образом, суммарно будут посещены 8 секций. Можно показать, что этот результат улучшить нельзя.

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

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

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

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

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

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

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

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