Блог пользователя ashmelev

Автор ashmelev, 12 лет назад, По-русски

Задача 175A - Robot Bicorn Attack

Переберем все возможные разбиения данной строки на 3 подстроки (например, перебрав пару индексов – конец первой подстроки и конец второй подстроки). Если при разбиении все три подстроки удовлетворяют ограничениям (не имеют ведущих нулей и соответствующие им числа не превосходят 1000000), то пытаемся обновить текущей ответ суммой чисел данных подстрок. Всего количество разбиений O(N^2), где N – длина исходной строки. Проверка одного разбиения осуществляется за O(N)

Задача 175B - Plane of Tanks: Pro

Для решения необходимо промоделировать действия описанные в условии. Для каждого игрока оставим наилучший результат и посчитаем общее количество игроков N. Далее для каждого игрока найдем количество игроков C, результат которых не лучше наилучшего результата рассматриваемого игрока (это можно сделать простым циклом по всем игрокам). Далее необходимо определить его категорию по числам C и N. Для избежания проблем с точностью можно воспользоваться следующим подходом:

  • если C * 100 >= N * 99, то игрок относится к категории "pro"
  • если C * 100 >= N * 90, то игрок — "hardcore"
  • если C * 100 >= N * 80, то игрок — "average"
  • если C * 100 >= N * 50, то игрок — "random"

В противном случае игрок "noob".

Задача 175C - Geometry Horse

Очевидно, что фигуры следует уничтожать в порядке возрастания их стоимости. Отсортируем типы фигур в порядке возрастания стоимости. Создадим два указателя – позиция i в массиве P (текущий множитель) и позиция j в массиве типов фигур. При этом будем поддерживать текущий ответ и количество фигур G, которое необходимо уничтожить для перехода к следующему множителю. Если на очередном шаге количество фигур F текущего типа не превосходит G, то к ответу следует прибавить F * (i + 1) * Сj, G уменьшить на F, а указатель j увеличить на 1. В противном случае, к ответу необходимо прибавить G * (i + 1) * Cj, F уменьшить на G, указатель i увеличить на 1 и задать G = Pi – P(i-1). Такие итерации нужно продолжать, пока мы не просмотрим весь массив типов фигур.

Задача 175D - Plane of Tanks: Duel

Сначала необходимо определить исход битвы, если хотя бы одна из вероятностей непробития равна 100%. Если Вася не пробивает вражеский танк с вероятностью 100%, то ответ на задачу – 0. В противном случае, если Васин танк не пробивают с вероятностью 100%, то ответ на задачу – 1. Далее будем считать, что вероятности непробития не превосходят 99%. Можно проверить, что вероятность того, что танк останется живым после D = 5000 выстрелов по нему, меньше 10^-6 (для любых значений урона, пробиваемости и количества очков жизни). Для каждого из двух танков посчитаем следующую динамику dp[i][j] — вероятность того, что у танка останется j очков жизни после i выстрелов по нему. dp[0][hp] = 1, где hp – начальное количество очков жизни танка. Далее, для пересчета строки dp[i+1] достаточно для каждого значения j в строке dp[i] перебрать урон, который нанесет (i+1)-й снаряд (с учетом возможного непробития) и обновить соответствующее значение строки (i+1):

dp[i + 1][max(0, j – x)] += dp[i][j] * (1 – p) / (r – l + 1)

где p – вероятность непробития, x – потенциальный урон снаряда. Пусть dpv – полученная таблица для танка Васи, dpe – для танка врага.Теперь можно найти вероятность, что танк врага будет убит i-м выстрелом танка Васи: pk[i] = dpe[i][0] – dpe[i-1][0]. Заметим, что победы Васи происходят следующим образом: Вася сделал (K — 1) выстрелов и не убил вражеский танк, при этом не умер и сам. После чего Вася произвел K-й выстрел и уничтожил врага. Переберем K и посчитаем вероятность победы Васи K-м выстрелом. Для этого найдем, сколько выстрелов T успеет произвести враг прежде чем Вася выстрелит K-й раз (здесь нам единственный раз в решении понадобится скорострельность орудий):

T = ((K – 1) * dtv + dte - 1) / dte

где dtv – время перезарядки танка Васи, dte – время перезарядки врага. Тогда вероятность победы будет равна (1 – dpv[T][0]) * pk[K]. Просуммировав такие вероятности для K от 1 до D мы получим ответ. Вычислительная сложность алгоритма при этом есть O(D * hp * (r – l)).

Задача 175E - Power Defence

Заметим, что если отразить позицию башню относительно прямой OX, то интервал на пути движения монстра, на котором будет действовать башня, не изменится. Таким образом, можно считать, что башни разрешено строить в точках (_x_, 1), не более двух в одной точке. Далее заметим, что если существует такая точка X, что как слева, так и справа от нее располжены башни, а в самой точке X башен нет, то абсциссы всех «правых» башен можно уменьшить на 1 и от этого ответ не ухудшится. Аналогично, можно считать, что не существует двух соседних точек, в каждой из которых стоит ровно по одной башне. Теперь легко проверить, что для построения оптимального решения нам достаточно 13 подряд идущих целых точек. Переберем позиции замедляющих башен. В худшем случае, способов расставить замедляющие башни на 13 точках будет порядка 200000. Пусть мы зафиксировали некоторое расположение замедляющих башен. Для каждой из оставшихся свободных точек (точки, в которые можно поставить две башни, раздваиваем) посчитаем, какой урон нанесет огненная или электрическая башня, расположенная в этой точке, и сохраним полученные числа в массиве d (_d_[k].f и d[k].e – урон огненной и электрической башнями в точке k соответственно). Полученный массив пар значений отсортируем в порядке убывания первого значения d[k].f. Тогда оптимальное расположение оставшихся башен можно найти при помощи динамического программирования. Обозначим за dp[i][j] – наибольший урон, который можно получить, если у нас осталось i огненных башен и j электрических. Обозначим за p следующую величину p = cf – i + ce – j – количество башен, которое мы уже расставили при данном состоянии динамики. Заметим, что если i = 0, то мы использовали первые p значений массива d и ответом будет сумма наибольших j элементов d[k].e, начиная с индекса p. Иначе, мы либо ставим одну огненную башню, либо одну электрическую в позицию p. Не ставить башню в позицию p невыгодно в силу уменьшения значения d[p].f. Тогда получаем:

dp[i][j] += max(dp[i - 1][j] + d[p].f, d[i][j – 1] + d[p].e)

Ответом при данном расположении будет значение dp[cf][ce], которое вычисляется за время O(cf * ce * log(ce))

Замечание1: перебор можно сократить почти в 2 раза в силу того, что любые две симметричные друг другу расстановки эквивалентны между собой и дадут одинаковый ответ, однако, при данных ограничениях эта оптимизация не является необходимой

Замечание2: формула снижения скорости монстра 1 / (K + 1) позволяет легко посчитать урон от башни при фиксированных позициях замедляющих башен – замедляющие башни можно рассматривать независимо друг от друга

Разбор задач Codeforces Round 115
  • Проголосовать: нравится
  • +23
  • Проголосовать: не нравится

»
12 лет назад, # |
  Проголосовать: нравится +35 Проголосовать: не нравится

Пояснение к задаче 175B - Plane of Tanks: Pro:

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +12 Проголосовать: не нравится

    Таки случайный игрок — это casual player, а не random)

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится +20 Проголосовать: не нравится

      И да попадут минусующие в грамматический концлагерь.

»
12 лет назад, # |
  Проголосовать: нравится -35 Проголосовать: не нравится

Ну вот что у меня не так в С? 1539455

И ещё, предлагаю админам дать возможность участникам смотреть полные версии тестов. А то я сижу, смотрю на: "16 196661091 17 765544213 322 134522506 115 914609421 163 219016066 227 835576807 856 682158845 914 11248128 145 876496017 854 141052597 530 163180278 315 407245991 60 294673989 270 2976249 26 674132026 519 347829904 23 16 6280951514 533..." и думаю: "Что же там дальше, за этим многоточием?" =)

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +17 Проголосовать: не нравится

    Ну а что ты собираешься делать с полным тестом?

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится -27 Проголосовать: не нравится

      Отлаживать на нем программу, что же ещё с ними можно делать? Да, да. Есть такие, кто будет ждать полчаса, пока не найдет косяк)

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится +20 Проголосовать: не нравится

        Отлаживание программы на таком тесте — бесполезная трата твоего времени. Гораздо быстрее и эффективнее внимательнее прочитать свой код несколько раз.

        • »
          »
          »
          »
          »
          12 лет назад, # ^ |
            Проголосовать: нравится -22 Проголосовать: не нравится

          Именно этот тест не такой уж и большой (n = 16, t = 16). На нем вполне можно найти ошибку

          • »
            »
            »
            »
            »
            »
            12 лет назад, # ^ |
              Проголосовать: нравится +13 Проголосовать: не нравится

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

            Кстати, 1539518. Я уже просмотрел твой код и нашел ошибку.

            • »
              »
              »
              »
              »
              »
              »
              12 лет назад, # ^ |
                Проголосовать: нравится -24 Проголосовать: не нравится

              Спасибо! У меня на компе Delphi не хочет напрямую читать int64, пишет "Invalid numeric input". Поэтому и считываю их через extended)

              • »
                »
                »
                »
                »
                »
                »
                »
                12 лет назад, # ^ |
                  Проголосовать: нравится +9 Проголосовать: не нравится

                Ошибка была не в этом )) У тебя счетчик убитых врагов был integer.

        • »
          »
          »
          »
          »
          12 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Кстати не правда. Если есть еще и правильное решение, то наличие даже большого теста может быть полезным. Помню как Эдмонса на тимус сдавал. Маленький тест не генился в упор. А вот уменьшать в автоматическом режиме тест размера 400 до теста размера 25 вполне получилось.

»
12 лет назад, # |
  Проголосовать: нравится -36 Проголосовать: не нравится

"Задача 175B — Plane of Tanks: Pro..."

Это оказывается разбор? Я сначала подумал, что вы просто условие задачи переписали))

  • »
    »
    12 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +5 Проголосовать: не нравится

    Переписал на более подробное объяснение. Вряд ли от этого кто-то что-то новое узнает :)

»
12 лет назад, # |
  Проголосовать: нравится +9 Проголосовать: не нравится

THX!But how can I find solution to F?

»
12 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Are there anyone who are kind enough to translate this image into English?

This image was posted to the Russian version of this article.

  • »
    »
    12 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится +10 Проголосовать: не нравится
    1. 1) noob "this game is quite nice and people are so kind"
    2. 2) random player "we've lost, but I had so much fun!"
    3. 3) avrerage player "We've lost again... But, undoubtedly, we will win next round!"
    4. 4) hardcore player "OMG THIS TEAM SUCKS, DOES ANYONE OF YOU KNOW HOW TO PLAY?"
    5. 5) Pro