Анализ Задач Четвертого Отборочного Тура Russian Code Cup 2014



Анализ задач четвертого отборочного тура Russian Code Cup 2014

В воскресенье, 1 июня, состоялся четвертый, заключительный отборочный этап Russian Code Cup 2014. Для участия в туре зарегистрировались 5428 человек.

730 участников представили хотя бы одно решение.

Всего за раунд было отправлено 4793 решения, из них 1531 правильное.

Наибольшее количество решений в GNU C++ — 1786. В Python 307 решений, 86 из них правильные.

В PHP 93 решения, 15 из них правильные.

В Perl есть 6 решений, 2 из которых правильные.

Первым задачу А решил Дмитрий Филиппов (DimaPhil) за 2:42 минуты, а задачу Б он первым решил за 12:09. Задачи C и D впервые решил Александр Обедников (AOb) на 12:25 и 37:44 минутах соответственно.

Первым, кто решил задачу Е, стал Фефер Иван (Fefer.Ivan) на 45:22 минуте.

Также Иван первым выполнил все задания за 1 час 8 минут. Всего 5 задач решили 12 человек.

10 участников были дисквалифицированы судьями.

Всего за 4 отборочных тура в отборочный тур прошли 802 участника, которые сразятся друг с другом в финале 8 июня.

Проблема А .

Социальный опрос Идея: Андрей Станкевич Реализация: Николай Ведерников Анализ: Николай Ведерников Задача требует найти минимальное и максимально возможное количество участников, которые решат задачу.

Если общее количество участников н , из них способны решить задачу а , А б Участники находят задание отвратительным.

Поскольку по условиям задачи ее решат только те, кому она не противна и кто знает, как ее решить, то число тех, кто попытается решить задачу, будет равно или меньше н б .

То есть, если среди всех, кто пытается решить задачу, есть те, кто умеет это делать, то это будет максимум тех, кто ее решит. Это мин( а , н б ).

Минимум достигается, если каждый, кому задача противна, сможет решить задачу, тогда ответ max(0, а б ).

Проблема Б .

Сто Идея: Виталий Аксенов Реализация: Павел Кротков Анализ: Павел Кротков Решением проблемы является программа, внимательно рассматривающая несколько простых случаев.

Самый простой случай, когда количество цифр в числе Икс равно к +1. В этом случае вам нужно вывести −1, если число не содержит ни одного нуля, и ноль, если число содержит хотя бы один ноль.

Если количество цифр в числе Икс превышает к хотя бы три, к этой ситуации нужно относиться более осторожно.

Найдем второй ноль с конца в числе.

Давайте убедимся, что за этим не стоит ничего, кроме к +1 цифра.

Вычеркнем из числа все ненулевые цифры после предпоследнего нуля, а также вычеркнем необходимое количество цифр непосредственно перед предпоследним нулем.

Обратите внимание, что первая цифра никогда не зачеркивается, а это значит, что в конечном числе не будет ведущих нулей.

Важно было не забывать, что операцию зачеркивания цифры не следует выполнять на длину числа — решения с такой ошибкой получали превышенный лимит времени на третьем тесте.

Проблема С .

Собираюсь в гости Идея: Георгий Корнеев Реализация: Борис Минаев Анализ: Борис Минаев Для решения проблемы необходимо тщательно сымитировать процесс, описанный в условии.

При реализации удобно использовать встроенные инструменты ведения очереди.

В самих очередях можно хранить, например, номер человека, купившего соответствующий подарок.

Затем следующий визит происходит следующим образом.

Возьмем из очереди элемент, соответствующий человеку, пришедшему в гости.

Если его очередь пуста, то будем считать, что из очереди был взят элемент, соответствующий этому человеку.

После этого мы добавим этот элемент в очередь, соответствующую человеку, к которому мы пришли в гости.

Если значение добавленного элемента равно номеру очереди, в которую он был добавлен, то должно быть выведено ДА, в противном случае НЕТ.

Задача Д .

СНМ Идея: Артем Васильев Реализация: Артём Васильев Анализ: Артем Васильев Задача описывала реализацию системы непересекающихся множеств с эвристикой ранга, но без эвристики сжатия пути.

Решим задачу для каждого укорененного дерева самостоятельно; следует также рассмотреть случай наличия циклов.

Даже массив классифицировать и не был указан во входных данных, легко понять, что без сжатия пути классифицировать я — высота поддерева с вершиной я в корне.

Также отметим, что алгоритм устроен таким образом, что классифицировать я каждый раз увеличивается не более чем на единицу, а после подвешивания вершины к другой ее родитель И классифицировать не меняйте, поэтому вы можете строить от листьев к корням.

Рассмотрим поддерево с корнем в вершине ты .

Если классифицировать ты = р , затем вверху ты должны быть дети с рангом 0, 1, .

, р -1. Легко показать, что это условие является достаточным: если выполнить операции союз в порядке повышения ранга сына все операции будут проходить корректно.

Это приводит к решению для одного дерева:

  1. Давайте рекурсивно построим решение для всех дочерних элементов корня дерева.

  2. Давайте проверим это для всех час от 0 до классифицировать корень - Существует 1 сын с рангом час .

  3. Давайте проведем операции союз ( корень , ребенок я ) в порядке возрастания ранга ребенок я .

Также можно реализовать CHM и напрямую выполнять все операции, проверяя, что полученный массив родитель совпало с тем, что было нужно.

Время выполнения решения: О ( н бревно( н )).

Задача Е .

Нанороботы Идея: Виталий Аксенов Реализация: Андрей Комаров Анализ: Андрей Комаров Задача требует за минимальное количество ходов или разбиения на две части перенести всех нанороботов из левого верхнего угла в правый нижний.

Эту проблему мы решим с помощью динамического программирования.

Обозначим через дп [ ш ][ Икс ][ й ] минимальное количество шагов, за которое можно довести робота массой ш из клетки ( Икс , й ) до последней ячейки ( н , м ).

Начальные значения дп [ ш ][ н ][ м ] = 0 означает, что из целевой ячейки никуда выходить не нужно.

После дп будет рассчитано, ответ будет содержаться в ячейке дп [ ш ][1][1].

Давайте научимся считать дп .

Считать дп [ ш ][ я ][ дж ], мы сделаем одно из двух:

  • Давайте доберемся до финиша, не разбивая робота на части.

    Для этого с помощью обхода в глубину найдем кратчайший путь к финишу по уцелевшим клеткам.

  • Либо мы дойдем до какой-то ячейки, разделимся на две части и воспользуемся ими, чтобы добраться оттуда.

Чтобы избежать проблем с пониманием, в каком порядке считать значения динамики, можно считать их лениво.

Итоговая сложность алгоритма: О ( ш 2 н 2 м 2 ).

Теги: #программирование #спортивное программирование #rcc #rcc #rcc #кубок России по коду 2014

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.