1 of 23

Разбор

Олимпиады для 6-8 классов

Подготовили Матвей (Ирпаччи), Арсений (Хайфаев) и Дарина(Шуька)

2 of 23

A. Гарри Поттер и волшебный банк "Гринготтс"

3 of 23

Условие задачи - набрать N денежных единиц при помощи купюр номиналом 100, 20, 10, 5 и 1, используя как можно меньше купюр.

4 of 23

Задача решается жадно.

Будем брать купюры по 100, пока можем, затем поступаем точно так же с купюрами по 20, 10 и т.д.

Чтобы не делать это в явном виде, будем пользоваться операциями деления и взятия остатка по модулю.

5 of 23

Итоговая асимптотика - приблизительно О(1).

Посылка - https://pastebin.com/HekKyTyr

6 of 23

В. Гарри Поттер и Хогвартс-экспресс

7 of 23

Условие задачи - есть поезд, состоящий из вагонов. Каждый вагон имеет K мест в нем. Нужно узнать количество вагонов между вагоном, в котором есть место с номером X, и вагоном, в котором есть место с номером Y.

8 of 23

Задача решается формулами.

Номер вагона, в котором есть место с номером X, считается по формуле (X + K - 1) / K. Такая же формула для места с номером Y: (Y + K - 1) / K.

К номеру места мы прибавляли K - 1, чтобы реализовать округление вверх.

Осталось вывести разницу между (Y + K - 1) / K и (X + K - 1) / K

9 of 23

Итоговая асимптотика - O(1)

Посылка - https://pastebin.com/UKSpvvAQ

10 of 23

C. Гарри Поттер и очень секретное сообщение

11 of 23

Условие задачи - дано некоторое количество строк. Необходимо взять по первому элементу каждой строки и составить из них новую строку, которая и будет являться ответом.

12 of 23

Задача решается в лоб.

Единственная проблема, которая может возникнуть - ввод. Если пользоваться while(cin >> s), мы введём все строки по одной, как и нужно. Альтернативный вариант - использовать getline(cin, s) и добавлять в строку все элементы, перед которыми стоят пробелы (и первый).

13 of 23

Итоговая асимптотика - О(ввод), т.е. О(100).

Посылка - https://pastebin.com/R6YXD6j4

14 of 23

D. Гарри Поттер и "исчезательное" заклинание

15 of 23

Условие задачи - есть массив из N элементов. Мы можем сколько угодно раз удалить любой элемент, заплатив за него стоимость, равную любому из соседних элементов. Необходимо вывести минимальную стоимость для того, чтобы превратить массив в один элемент.

16 of 23

Задача решается в лоб.

Заметим, что мы не можем удалить элемент за стоимость меньше минимального элемента в массиве. Тогда давайте будем просто удалять элементы рядом с минимальным, чтобы платить именно эту стоимость. В итоге получаем, что все элементы были удалены за К, где К - минимальный элемент массива.

17 of 23

Итоговая асимптотика - О(N).

Посылка - https://pastebin.com/qs96EJEC

18 of 23

E. Гарри Поттер и лифт в Министерстве магии

19 of 23

Условие задачи - есть N этажей и N сотрудников, по одному на этаж. Лифт стоит на 0 этаже, и один раз поднимается на любой этаж со скоростью С секунд на этаж. Сотрудник поднимается на 1 этаж за А секунд, спускается за В секунд. Необходимо вывести номер этажа, на который должен подняться лифт, чтобы сотрудники вернулись на свои этажи как можно быстрее.

20 of 23

Решение задачи:

Заметим, что нам имеет смысл смотреть только на тех сотрудников, которым нужно на первый и последний этаж. Тогда, если мы поднимаемся на этаж X, затрачивается время

x * c + max(b * (x - 1), a * (n - x)).

21 of 23

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

Тогда b * (x - 1) ≈ a * (n - x).

Путём выражения получаем, что x ≈ (na + b) / (a + b).

Проверим на ответ этажи Х и Х + 1 и выберем минимальный по ответу.

22 of 23

Итоговая асимптотика - О(1).

Посылка - https://pastebin.com/QVbnbfwV

23 of 23