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

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

Вот и начинается СРМ 572. Желаю удачи и после матча всем предлагаю обсудить здесь задачи.

  • Проголосовать: нравится
  • +32
  • Проголосовать: не нравится

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

АААргх. Понятно конечно что я сам себе злой Буратино, но если уж делать анонсы, то можно их делать и несколько заранее)

»
11 лет назад, # |
Rev. 5   Проголосовать: нравится -16 Проголосовать: не нравится

Как решать Div2 1000? Понятно что там нужна динамика и комбинаторика. Но из-за модуля я никак не могу нормально динамику организовать из обычного алгоритма без модуля.

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

После конца срма будет интересно узнать, заходит ли в 500 див1 перебор первых 6 символов, а для последних трёх прекалк(тут двух лонгов для хранения каждой из комбинаций должно хватать)?

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

    Решение — это почти то, о чем вы говорите, а именно — MeetInTheMiddle. Переберем первую половину ответа. Переберем вторую половину ответа отдельно. Для каждого варианта и каждого запроса посчитаем, сколько символов матчится. Сохраним результаты (например, как string, где на i-том месте записано, сколько символов матчится у текущего варианта с i-тым запросом) в map или hashtable.

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

    Понятно объяснил?

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

      Да, спасибо. Почему-то казалось, что делить пополам не заходит, так как вторую половину сложно искать, и надо подбирать баланс.

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

Расскажите, пожалуйста, кто знает, как решать 1000? :)

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

    Была такая идея, не заработало на 6 сэмпле. Где-то баг.

    Посмотрим на первую букву, которая куда-то перешла. Переберем как ее перевести — или по часовой стрелке или против. Тогда все остальное задается однозначно. Посмотрим что получится. Выберем лучшее из двух.

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

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

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

    Слова одинаковые => 0

    В goal 26 букв => -1

    Всё идёт в одну букву => надо перебрать сколько букв сдвигать вправо а сколько влево.

    А теперь самое интересное.

    У нас есть список отрезков, переходящих в какие-то буквы.

    Очевидно, как вычислить цену перехода отрезок в букву без учёта циклов.

    Сам алгоритм: внешний цикл — это перебор относительного сдвига (+0, +26, -26) первого отрезка относительно первой буквы, а внутренний — это проход по всем отрезкам. Если так получилось что во внутреннем цикле мы намотали более одного круга по goal, то решения нет.