Всем привет! Сегодня я хотел бы представить разбор на вчерашний раунд. Если какая-то часть останется не до конца ясной, смело смотрите код — он полностью прояснит решение.
Полное решение:
Заметим:
- если a < b, то ответ всегда равен 2. Мы можем сначала выбрать a, затем b.
Пример: a = 2, b = 5 → 2 → 5.
- если a > b, то ответ не может быть 2.
Пример: a = 4, b = 2. Если взять 4, то потом выбрать 2 нельзя.
Однако есть другой способ:
- если
a > bиa - 1 > b, то можно выбрать1, затемb, и затемa - (b+1). Всего получится3хода. - если же
a - 1 == b, то решение невозможно. Пример:a = 5, b = 4. После выбора1и4придётся снова выбрать4, но это запрещено. Ответ:-1.
Алгоритм:
- Если
a < b→ ответ2. - Если
a > bиa - 1 > b→ ответ3. - Если
a - 1 == b→ ответ-1.
Полное решение:
Идея: Заметим, что 1,1+n, 2,2-n-1,... такое решение будет работать всегда. Иногда индексы могут перекрываться, поэтому будем делать это пока индекс не свободно x+n-(x-1)..... Для каждого таких индексов ставим n, a[l] = n, a[l+n-(l-1)], и снизим наш н. Это гарантирует для каждого n, что дистанция будет делиться на n.
Алгоритм:
- Идём по индексам и формируем пары с расстоянием
n. - Заполняем значения.
- Уменьшаем
nи повторяем. - Выводим перестановку.
Полное решение:
Рассмотрим, когда ответ невозможен:
- базовый плохой случай — подстрока 101.
В этом случае кролика перекрывают два непустых горшка, и сделать ничего нельзя.
- более сложные варианты (100101, 010011 и т.д.) тоже сводятся к наличию шаблона 101.
Таким образом, условие сводится к проверке на подстроку 101.
Алгоритм:
- Заводим два указателя.
- Ищем чередующуюся последовательность, начинающуюся с
1. - Если её длина кратна
3, то где-то внутри обязательно будет101, → ответ "NO". - Иначе выводим "YES".
Полное решение:
Разберём отдельно два случая:
- Если
xчётное. Пусть у Алисыsum1, у Бобаsum2. Тогда после выбора хода суммы будут меняться так:
(sum1+f(x)), (sum2+f(x-1)), (sum1+f(x-2)), (sum2+f(x-3))...
В итоге оба игрока могут сделать так, чтобы суммы были равны.
- Если
xнечётное. Теперь счёт всегда смещается в пользу того, кто сделал ход. Игроки будут выбирать только нечётные числа, причём самые выгодные (с максимальнымf(x)).
Подсчёт:
- для нечётных
xвклад в счёт:
sum += ((x+1)/2) * f(x)
(для игрока, чей ход). * у второго игрока остаётся:
sum2 += (x - (x+1)/2) * f(x). * для чётных x вклад одинаковый для обоих игроков, поэтому порядок ходов не важен.
Алгоритм:
- Подсчитать
f(x)для каждого элемента. - Разбить на чётные и нечётные.
- Отсортировать нечётные по убыванию частоты.
- Ход за ходом распределять числа:
- если ход Алисы → она берёт лучшие нечётные;
- если ход Боба → он берёт следующие.
- Добавить чётные к обеим суммам поровну.
- Вывести суммы Алисы и Боба.



