Loading [MathJax]/jax/output/CommonHTML/jax.js

Короткий розбір The Algo Battles 2023 - Етап 2 | Статті

A. Кредитнi картки

В задачі потрібно просто зробити те, що сказано в умові. Для спрощення написання коду, можна не будувати нову стрічку, а одразу рахувати суму.

Код розв’язку.

Цікавий факт: крім банківських карток алгоритм Луна використовується для IMEI та номерів соціального страхування в Канаді.

B. Розклад на множники

Будемо перебирати pi та ділити n на pi, поки n ділиться на pi без остачі. Якщо після цих операцій ми отримали одиницю — відповідь YES, інакше NO.

Код розв’язку.

Цікавий факт: на квітень 2023, найбільше відоме людству просте число 2825899331. Це число має 24862048 цифр.

С. Найближчi точки

Задачу можна розв’язувати незалежно по x і y. Для однієї із координат відповіддю завжди буде одна із сусідніх пар в посортованому масиві. Достатньо вибрати із двох відповідей меншу. Під час сортування треба бути обережним, щоб також мінімізувати i+j. Для цього слід сортувати не лише по координаті, а й по номеру.

Код розв’язку.

Цікавий факт: Точка-У здатна гатити орків на відстані до 120км.

D. Помаранчева революцiя

Нескладно помітити, що якщо b=c, ми можемо досягти Помаранчевої Революції зробивши b червоно-голубих зустрічей.

Подивимося уважно, що стається із (bc) після зустрічі оранжевого і голубого:

a=a1b=b1c=c+1+1+kbc=(bc)(k+3)

Аналогічно після зустрічі оранжевого і червоного

a=a1b=b+1+1+kc=c1bc=(bc)+(k+3)

Бачимо, що різниця не міняє остачі від ділення на (k+3). Отже якщо (bc) не ділиться на (k+3) націло, то отримати b=c неможливо і відповідь NO. Інакше відповідь YES. Для знаходження порядку зустрічей застосуємо жадібний підхід.

Код розв’язку.

Цікавий факт: Вважають, що давні єгиптяни одними з перших бджолярів в світі.

E. Рамки Малевича

Розгленемо будь-яку сторону квадрата. Припустимо ми зафіксували кутики. Можливо показати, що якщо обидва кутики є випуклими, то сторона буде валідною тоді і тільки тоді, якщо кількість частинок 5-го типу є на один більшою ніж 6-го. Аналогічно, якщо обидва кутики є впуклими, то кількість частинок 6-го типу має бути на один більшою за кількість частинок 5-го. Якщо ж кутики різного типу, то кількість частинок 5-го і 6-го типів повинна бути однаковою. Кількість частинок 7-го типу може бути будь-якою.

Переберемо парність n і кутики. Для кожної сторони виставимо обов’язкові частинки - можливо одну з 5-го або 6-го типу і можливо одну 7-го, щоб була потрібна парність. Після цього можна добирати будь-яку кількість пар - 5 і 6 або дві 7.

Тож ми можемо перебрати усі можливо рамки розміру 3х3 та 4х4 і максимізувати кількість можливих пар. Тоді щоб збільшити n на 2 потрібно використати 4 пари. Перебирати можна кутики з виставленням необхідних частинок. Або можна перебрати усі 28 та 212 варіантів з’єднань.

Код розв’язку з перебором кутиків

Код розв’язку з перебором варіантів

Цікавий факт: Вважають, що аматорським малюванням Казимир Малевич почав займатися в Конотопі.

F. Пляцок

Програшні позиції — многокутники, для яких відстань від лівого краю до правого рівна відстані від нижнього до верхнього max(xi)min(xi)=max(yi)min(yi) (назвемо такі многокутники обрізаними квадратами), і з них за одну операцію не можна відрізати многокутник з такими ж характеристиками. Можна довести, що з обрізаного прямокутника завжди можна за одну операцію вирізати обрізаний квадрат, з якого в свою чергу за одну операцію не можна вирізати обрізаний квадрат, тільки прямокутник: max(xi)min(xi)max(yi)min(yi). Для цього підійде обрізаний квадрат найменшого розміру.

Імплементація: йдемо з лівого краю многокутника до правого і підтримуємо найвищу і найнижчу точку, таким чином ми знаємо: min(xi) — лівий край, max(yi) — координата y найвищої розглянутої точки, min(yi) — координата y найнижчої розглянутої точки, max(xi) — поточна x координата. Якщо в якийсь момент до досягнення правого краю рівність буде виконуватись, то виграє перший гравець. Аналогічний прохід треба зробити зліва направо, зверху вниз і знизу вверх. Якщо рівність ніколи не виконається — виграє другий гравець. Складність O(dx+dy+n).

Код розв’язку.

Цікавий факт: найбільший спечений пляцок важив 10540 кг.

G. Налийте якомога швидше

Проходимо по масиву часткових різниць зліва направо і підтримуємо кількість відкритих проміжків висоти 1 (ціна створення 1) та відкриті проміжки висоти x (ціна створення 1, але їх можна розбити на x одиничних проміжків за певну ціну). Проміжків висоти 1 в нас завжди буде менше, ніж х; якщо більше, то поміняємо їх на один проміжок х з ціною розбиття 0. Маємо два випадки:

  • Часткова різниця a додатня. Поки ax додаємо проміжок x з ціною x1 та 1 до відповіді. Залишилось a<x, треба або відкрити a проміжків висоти 1 або відкрити 1 проміжок висоти x і закрити xa проміжків висоти 1. Якщо кількість відкритих проміжків висоти 1 не менше xa: тоді закриваємо xa одиничних і додаємо один проміжок висоти x з ціною a1, +1 до відповіді. Інакше, збільшуємо кількість відкритих одиничних відрізків на a і якщо вигідніше розбити найдешевший (нехай його ціна p) x проміжок для об’єднання p+1<x, то розбиваємо його і додаємо до відповіді p+1 і формуємо новий x проміжок з ціною a1, інакше просто додаємо до відповіді a.

  • Часткова різниця a від’ємна. Аналогічно поки ax закриваємо найдорожчий проміжок висоти x. Тепер ми можемо або закрити a проміжків висоти 1 і нічого не платити, або закрити один x і відкрити xa 1 і заплатити xa. Якщо в нас є a проміжків висоти 1, то закриваємо їх і міняємо проміжок висоти x на інший з ціною xa якщо це вигідно (вона менша). Якщо немає, тоді можливо вигідно поміняти найдешевший (нехай його ціна p) x на проміжки висоти 1. Тоді в першому випадку ми платимо p, в другому xa. Тобто якщо p<xa, то заплатимо p, закриємо цей проміжок висоти x і можемо змінити найдорожчий відрізок x на інший з ціною xa; інакше заплатимо xa і видалимо найдорожчий відрізок x (треба видалити відрізок ціною xa і можна замінити найдорожчий відрізок x на інший з ціною xa => просто видалимо найдорожчий відрізок x).

Складність O(nlog(n)).

Код розв’язку.

Цікавий факт: Бар Шона в Ірландії працює безперервно ще з середньовіччя.