Archive

Archive for the ‘Комбінаторика’ Category

Розв’язання задачі MappingABC з TopCoder

Тут я розгляну розв’язок задачі MappingABC з TopCoder. Це задача з першого дивізіону другого рівня складності, тому вона вимагає певний рівень учасника для розв’язання.

Основне спостереження, яке допомагає в розв’язанні – це те, що для того, щоб порахувати всі прийнятні рядки ми можемо розбити рядок на три підрядки: до першого A – [0, FA], між першим A і останнім C – [FA, LC] і після останнього C – [LC,t.size()-1]. Ми рахуємо лише ті рядки в яких у [FA, LC] трапляється B.

Введемо дві множини для позначення символів які трапляються лише зовні [FA, LC] і інші, відповідно \mathcal O і \mathcal I. Тоді кількість прийнятних рядків така:
\prod_{s\in \mathcal O}\mbox{bitcount}(s) + \Big( \prod_{s\in \mathcal I}\mbox{bitcount}(s) - \prod_{s\in \mathcal I}\mbox{bitcount}(s \& 5) \Big).

Дивись коментарі в сирцевому коді для подальших роз’яснень.
Читати далі…

Advertisements
Категорії:C++, Комбінаторика Позначки:, ,

Розв’язання задачі BearEmptyCoin

Нещодавно спробував одну з задач першого дивізіону на топкодері. Задача виявилось надто складною для того, щоб я її самостійно розв’язав, навіть зрозуміти код, який вільно доступний, я не зміг. Отже, шукав допомоги в інтернеті. На запит “BearEmptyCoin” Google мені видав кілька посилань власне на topcoder.com і посилання на три блоги, китайською, корейською і японською мовами:) За допомогою Google перекладача, який досить невміло перекладає з цих мов, мені вдалось якось докопатись до істини. Тому, зараз я можу поділитись поясненням розв’язку із вами.

Формулювання

Маємо чесну монету, чисту з обох боків. Цією монетою ми гратимемо в гру. На початку рахунок 0, гра триватиме K раундів. Кожен раунд такий:
1. Вкидаємо монету.
2. Якщо верхній бік порожній, то записуємо на нього число, яке забажаємо.
3. Додаємо до рахунку число записане на верхньому боку монетки.
Для перемоги потрібно, щоб кінцевий рахунок був S.

На вході ми маємо K, S. Нехай P – ймовірність виграшу у разі слідування найоптимальнішій стратегії. Можна показати, що P помножена на 2^K є цілим числом. Повернути це число.
Читати далі…