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

Обласна олімпіада 2018 (розбір) | Статті

A. Гра в карти

Паліндром парної довжини має вигляд s+r, а непарної — s+c+r, де s — деякий рядок, r — розвернутий s, c — деякий символ.

Кожен символ зустрічається однакову кількість разів в s і r. Якщо символ зустрічається на a картах, то додамо його a2 входжень до рядка s. Якщо існує символ c, який зустрічається на непарній кількості карт, то виведемо паліндром s+c+r, інакше — s+r.

Код розв’язку C++

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

B. Земля й Місяць

Спершу треба розглянути тривіальні випадки: круги не перетинаються або один круг міститься в іншому.

image

image

На рисунках зображені варіанти розташування кіл. Застосувавши теорему косинусів до трикутника O1AO2, отримаємо r22=d2+r212dr1cosα1, r21=d2+r222dr2cosα2. Звідси можемо знайти кути α1 і α2.

Площа перетину кругів — це сума площ двох сегментів. Центральний кут сегмента першого круга — AO1B=2α1, площа цього сегмента — (α1sin2α12)r21 (формула для площі сегмента з Вікіпедії). Площу іншого сегмента знаходимо так само.

Код розв’язку C++

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

C. Сходи до Місяця

Скористаємося підходом динамічного програмування. Якщо ви не знаєте, що це, то радимо прослухати відеолекцію.

Станом динаміки dp є трійка чисел (i,mn,mx), де i — скільки сходинок уже подолав Зеник, mn і mx — найкоротший і найдовший кроки. Значенням динаміки є кількість способів потрапити в такий стан.

Ініціалізуємо значення dp[i][i][i]=1 — Зеник зробив один крок на i сходинок. Зі стану (i,mn,mx) є переходи в стани (i+j,min{mn,j},max{mx,j}), де j — довжина нового кроку.

Відповіддю на задачу буде сума dp[n][mn][mx] для всіх mn,mx, що задовольняють умову mxmnk.

Складність розв’язку: O(n4).

Код розв’язку C++

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

D. Гра на прямiй

Нехай si=i1j=1aj. Пересунути фішку з позиції x у позицію y коштує |sysx|.

Тепер задачу можна переформулювати так. Задано n точок на прямій, i-а точка має координату si. Починаємо з точки s1=0. Хочемо відвідати всі та мінімізувати відстань, яку пройдемо.

Очевидно, що оптимально піти до найлівішої точки, потім — до найправішої, або навпаки.

Складність розв’язку: O(n).

Код розв’язку C++

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