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

Задача А. Экзамен.

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

Переведем время начала и конца экзамена в секунды по формуле 60 × 60 × hh + 60 × mm + ss, а также время, которое потратит Игорь на написание программы, по формуле 60 × k. Затем вычислим длину экзамена по формуле: timeexam = (timeend - timestart + 24 × 60 × 60) % (24 × 60 × 60), если же timeexam = 0, то на самом деле длина экзамена 24 × 60 × 60. Если время написания программы меньше продолжительности экзамена, то ответ Perfect. Если время написания экзамена меньше чем продолжительность экзамена увеличенного на час (60 × 60 секунд), то ответ Test. Иначе ответ Fail.

Задача B. Сообщение.

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

Заметим, что ответ равен числу всех возможных сообщений, минус число тандемных повторов. Обозначим за m число вопросов в строке, а за 2l длину строки. Тогда количество всех возможных сообщений равно 2m. Число тандемных повторов можно найти из следующих рассуждений. Если на позиции i стоит знак вопроса, а на позиции i + l a или b, то в тандемном повторе, на позиции i должна стоять та же буква. Если же на обеих позициях i и i + l стоят знаки вопроса, то ответ нужно домножить на два. Аналогично рассматривается ситуация, когда знак вопроса стоит на позиции i + l. Если на позициях i и i + l стоят различные буквы, то тандемных повторов для такой строки не существует.

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

Задача C. Матч века.

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

Пусть в матче участвуют 2 × n игроков. Пронумеруем их в порядке возрастания роста. Теперь докажем следующее утверждение: искомая сумма одинакова при любом разбиении по командам, и равна an + 1 + an + 2 + ... + a2 × n - a1 - a2 - ... - an. Переформулируем: рост любого игрока, номер которого не превышает n, всегда входит в искомую сумму со знаком минус, а рост игрока, номер которого больше n, входит в искомую сумму с плюсом.

Доказывать утверждение будем по индукции. Очевидно, что оно выполняется для случая с n = 1. Теперь докажем справедливость утверждения для произвольного n при условии справедливости для n - 1. Посмотрим на то, в какую команду попал игрок с наименьшим ростом. Если он оказался в первой команде, он получит в ней номер n. Заметим, что игрок второй команды, получивший тот же номер, окажется, как минимум, (n + 1)-м по росту среди всех игроков матча. Выкинем из состава этих игроков, после чего задача сведеся к меньшей. Случай, в котором игрок с наименьшим ростом попал во вторую команду, рассматривается аналогично.

После доказательства этого утверждения, решение задачи становится очевидным. Можно, например, за O(n×log2n) отсортировать всех игроков по росту, после чего учесть первых n с минусом, а остальных — с плюсом.

Задача D. Разбиение на массивы.

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

Основная идея решения — предподсчет и перебор с отсечениями. Для начала выясним, для каких значений n ответ не существует. Сумма всех чисел от 1 до 3n равна 3n*(3n+1)/2. С другой стороны, обозначим сумму элементов массива с за S. Тогда сумма элементов в массивах а и b также равна S. Получаем, что 2S = 3n*(3n+1)/2, то есть, 3n*(3n+1)/2 должно делиться на 4, что выполняется тогда и только тогда, когда n сравнимо с 0 или 1 по модулю 4. В тех случаях, когда остаток от деления n на 4 равен 2 или 3, решения гарантированно не существует. При заданных в условии ограничениях для всех остальных n решение существует.

Для ускорения перебора следует применить эвристики и отсечения. В авторском решении используется то, что при заданных ограничениях, если существует решение, то существует решение, в котором массив a заполнен числами от 1 до n. С данной эвристикой авторское решение способно находить ответ за 3 секунды для всех n от 1 до 36.

Задача E. Лесной феномен.

Идея: Виталий Демьянюк.
Реализация: Виталий Демьянюк.
Разбор: Виталий Демьянюк.

Обозначим x как один из возможных сценариев раздачи дров. Определим li,j(x) как функцию, которая равна единице, если у лесника, живущего в квадрате с координатами i и j, есть дрова на зиму, и нулю в противном случае. Количество лесников, у которых есть дрова на зиму, равно сумме li,j(x) по всем квадратам леса. Тогда, по линейности математического ожидания, требуемое ожидание равно сумме математических ожиданий li,j по всем квадратам леса. Найдем математическое ожидание li,j : E(li,j) = 0 × pi,j + 1 × (1- pi,j) = 1 - pi,j , где pi,j вероятность того, что у соответствующего лесника не осталось дров на зиму. Посчитать pi,j можно, как произведение вероятностей событий того, что от соответствующего соседа лесник не получил дров.

На рисунке выше у квадратов с одинаковым цветом pi,j равны. Поэтому, для каждого типа необходимо посчитать количество клеток и умножить его на соотвествующее pi,j, затем все сложить. Время работы программы O(1), так как типов всего шесть. Также нужно отдельно рассмотреть случаи, когда меньшая из сторон равна одному, двум или трем.