Второй квалификационный раунд

Задача A. Молекула.

Идея: Виталий Аксенов.
Условие: Анна Малова.
Реализация: Андрей Комаров.
Разбор: Анна Малова.

Обозначим за m число блоков одинакого цвета в молекуле. Заметим, что m четное, а число черных и белых блоков одинаково. Из очевидного факта, что у куска два конца и он задевает два блока следует, что при каждой перестройке молекулы, число блоков каждого цвета уменьшится не более, чем на один. Уменьшить число блоков каждого цвета ровно на один можно следующим образом: вырежем один блок и встроим его в середину другого блока такого же цвета. Таким образом, всего ученым потребуется m/2 - 1 операций.

Время работы O(длины молекулы).

Задача B. Морской бой.

Идея: Виталий Аксёнов.
Реализация: Борис Минаев.
Разбор: Борис Минаев.

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

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

Если хотя бы в одном из случаев мы смогли разместить прямоугольники, то ответ Yes, иначе No.

Задача C. Пробка.

Идея: Виталий Аксенов.
Реализация: Николай Ведерников.
Разбор: Николай Ведерников.

В задаче требовалось узнать, за сколько минут профессор доедет до своей работы. Когда одна машина догоняет другую, она начинает ехать за ней с той же скоростью. Тогда можно считать, что первая машина имеет длину lenfirst + L + lensecond, а второй нет. Рассмотрим момент времени, когда i-ая машина догонит (i + 1)-ую, если же она её не догонит, будем считать, что этот момент произодёт в бесконечности. Так же рассмотрим момент времени, когда машина профессора доедет до финиша. Выберем событие, которое произойдёт раньше всего. Добавим время, через которое оно произойдет, к ответу. Если же это событие — финиш машины профессора, то задача решена. Иначе объединим машины по описаному выше правилу и решим задачу меньшей размерности. Эта фаза выполняется за O(n). Всего таких фаз не более, чем n.

Итого время работы O(n2). Применением различных структур данных это решение можно ускорить до O(n log n) и даже до O(n).

Задача D. Таблица.

Идея: Виталий Аксёнов.
Реализация: Виталий Аксёнов.
Разбор: Виталий Аксёнов.

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

 

Следует разобрать 3 случая:

  • n = 1. Тогда ответ будет равен 2m.
  • n = 2. Мы можем себе позволить только два одноцветных столбца — один чёрного, а другой белого цвета. Все остальные столбцы должны быть двухцветные, то есть у каждого по два варианта. Значит, ответ равен Cm2·2m - 1 + Cm1 ·2m + 2m.
  • n > 2. Можно заметить, что если m > 6, то не существует ни одной хорошей раскраски. Действительно, раскраска первого столбца с раскраской второго может совпадать только в двух местах. Аналогично, с раскрасками первого и третьего. А если m > 6, то раскраска второго и третьего совпадают как минимум в трёх местах. А это и означает, что хорошей раскраски нет. После того, как мы ограничили размеры таблицы, легко понять, что для оставшихся успевает отработать перебор.

 

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

Задача E. Космическая экспедиция.

Идея: Виталий Аксенов.
Реализация: Павел Кротков.
Разбор: Павел Кротков.

Отсортируем все корабли по количеству топлива первого типа, которое им необходимо. После чего выберем максимальное t такое, что сумма ai у первых t кораблей не превышает k(n + 1). Эти t кораблей будут использовать топливо первого типа, а все остальные — топливо второго типа.

Докажем, что этот алгоритм всегда найдет ответ при условиях, поставленных в задаче. Заметим, что сумма ∑i=1t+1ai > n · (k+1). Значит, что для любого i > t выполняется ai > (n+1)/(t+1). Следовательно, получаем, что для любого i > t выполнено bi < 4k - (n+1)/(t+1). Осталось доказать, что вторая сумма не превышает заявленного выражения. ∑i=t+1n bi < (n - (t+1) + 1) · (4k - (n+1)/(t+1)) ≤ (n+1) · k. Последнее неравенство, после раскрытия скобок, превращается в неравенство "среднее арифметическое - среднее геометрическое". Значит, приведенный алгоритм всегда найдет решение.