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

К задаче 1

Школьный этап ВсОШ по информатике 2023/24, 9–11 классы.

Задачи тура

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

1. Пара-тройка конфет

1 секунда, математика

У Алисы сегодня день рождения, и она хочет угостить своих одноклассников конфетами. В магазине, в который она успеет зайти перед школой, есть сладости двух видов: шоколадные и карамельные. Они продаются наборами по 3 штуки, причем в упаковке есть конфеты каждого из двух видов (то есть в одной упаковке лежат две конфеты одного вида и одна конфета другого вида). По внешнему виду упаковки нельзя понять, какие конфеты лежат внутри.

Чтобы никого не обидеть, всем в классе нужно раздать конфеты одного вида, а оставшиеся девочка заберёт домой. Алисе нужно собираться в школу, поэтому она попросила вас посчитать, какое минимальное число упаковок нужно купить, чтобы конфет хватило на всех.

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

В единственной строке задано число () — количество человек в классе.

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

Выведите единственное число — количество упаковок, которое должна купить Алиса.

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

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

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

Замечание

В первом примере Алиса купит две упаковки с конфетами. В первой упаковке лежат 2 конфеты одного вида, и 1 конфета другого вида. Если вторая упаковка будет такая же, как и первая, то у Алисы окажется 4 конфеты одного вида и 2 конфеты другого вида. Если вторая упаковка будет отличаться от первой, то у Алисы будет по 3 конфеты каждого вида. В любом случае у Алисы найдётся 3 конфеты одного вида.

Как видно из первого примера, для того, чтобы гарантированно получить 4 конфеты одного вида, недостаточно купить две упаковки.

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

2. Речной бой

1 секунда, математика, игры

Поле в игре «Речной бой» представляет собой полоску длины клеток и шириной в одну клетку. Где-то на поле расположен корабль из клеток (). Какое наименьшее число выстрелов необходимо, чтобы гарантированно потопить корабль? После каждого выстрела сообщается его результат: «мимо», «ранен» или «убит».

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

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

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

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

Выведите одно целое число — количество выстрелов.

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

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

Замечание

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

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

3. Красивый шарф

1 секунда, математика

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

Незаметно для друга Алиса узнала, что ему большего всего нравятся различных цветов. Алиса приняла решение связать шарф размером , в котором будут чередоваться полоски различных цветов. Её друг никогда не ищет легких путей, поэтому она решила, что шарф с горизонтальными или вертикальными полосками покажется ему слишком «примитивным». Алиса решила, что полоски определённо должны быть диагональными!

Закончив вязать шарф, Алиса вспомнила, что один из цветов её друг считает особенным! Это цвет , который по его мнению приносит школьникам удачу на олимпиадах по информатике. И Алисе стало невероятно интересно, сколько фрагментов шарфа имеют именно такой цвет. Шарф получился очень большим, Алиса очень устала, пока его вязала, поэтому сама она уже не может ответить на этот вопрос и просит вас о помощи...

Более формально шарф можно представить в виде таблицы размером , каждая клетка которой покрашена в один из цветов. Цвета нумеруются от до .

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

При , и таблица будет иметь следующий вид:

Шарф 4×8 из трёх цветов
Шарф 4×8 из трёх цветов

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

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

Первая строка входных данных содержит натуральное число — ширину шарфа.

Вторая строка входных данных содержит натуральное число — длину шарфа.

Третья строка входных данных содержит натуральное число — количество любимых цветов друга Алисы.

Числа , и не превосходят .

Четвёртая строка входных данных содержит натуральное число — номер особенного цвета ().

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

Программа должна вывести одно целое число — количество клеток шарфа, которые покрашены в цвет .

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

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

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

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

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

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

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

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

Замечание

Картинка соответствует примеру из условия. Шарф имеет размеры и состоит из клеток трёх цветов. В цвет 1 покрашены 11 клеток.

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

4. Гостиница для жирафов

1 секунда, двоичная система, жадный алгоритм

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

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

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

Во входных данных записано единственное целое число — максимально возможная длина шеи жирафа ().

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

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

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

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

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

Замечание

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

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

5. Сломанный индикатор

1 секунда, множества, перебор

У радиолюбителя Алексея есть девятисегментный жидкокристаллический индикатор, который может показывать цифры от 0 до 9 в виде цифр «почтового индекса» (см. рисунок):

Цифры 0–9 на девятисегментном индикаторе
Цифры 0–9 на девятисегментном индикаторе

После неудачного эксперимента индикатор повредился, и часть сегментов могла перегореть. Когда сегмент перегорает, индикатор теряет возможность показывать цифры, использующие этот сегмент.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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