Паліндром парної довжини має вигляд s+r, а непарної — s+c+r, де s — деякий рядок, r — розвернутий s, c — деякий символ.
Кожен символ зустрічається однакову кількість разів в s і r. Якщо символ зустрічається на a картах, то додамо його ⌊a2⌋ входжень до рядка s. Якщо існує символ c, який зустрічається на непарній кількості карт, то виведемо паліндром s+c+r, інакше — s+r.
Спершу треба розглянути тривіальні випадки: круги не перетинаються або один круг міститься в іншому.
На рисунках зображені варіанти розташування кіл. Застосувавши теорему косинусів до трикутника O1AO2, отримаємо r22=d2+r21−2dr1cosα1, r21=d2+r22−2dr2cosα2. Звідси можемо знайти кути α1 і α2.
Площа перетину кругів — це сума площ двох сегментів. Центральний кут сегмента першого круга — ∠AO1B=2α1, площа цього сегмента — (α1−sin2α12)r21 (формула для площі сегмента з Вікіпедії). Площу іншого сегмента знаходимо так само.
Скористаємося підходом динамічного програмування. Якщо ви не знаєте, що це, то радимо прослухати відеолекцію.
Станом динаміки 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, що задовольняють умову mx−mn≤k.
Складність розв’язку: O(n4).
Нехай si=∑i−1j=1aj. Пересунути фішку з позиції x у позицію y коштує |sy−sx|.
Тепер задачу можна переформулювати так. Задано n точок на прямій, i-а точка має координату si. Починаємо з точки s1=0. Хочемо відвідати всі та мінімізувати відстань, яку пройдемо.
Очевидно, що оптимально піти до найлівішої точки, потім — до найправішої, або навпаки.
Складність розв’язку: O(n).