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

Автор Egor, 14 лет назад, По-русски
4 августа в 15:00 MSD состоится очередной TopCoder SRM
  • Проголосовать: нравится
  • +12
  • Проголосовать: не нравится

14 лет назад, # |
  Проголосовать: нравится +15 Проголосовать: не нравится
 это почти как праздник=)
спасибо за напоминание!
удачи всем;)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Полностью согласен. Уже пол-лета живу живу от SRM'a до SRM'a (:
14 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится
А чем member srm отличается от просто srm?
  • 14 лет назад, # ^ |
      Проголосовать: нравится +19 Проголосовать: не нравится
    Автору бабло не платят
    • 14 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится
      Раз речь зашла о бабле, у меня вопрос: кому и сколько в среднем платят на SRM'ах?
      • 14 лет назад, # ^ |
          Проголосовать: нравится +5 Проголосовать: не нравится
        http://www.topcoder.com/wiki/display/tc/Write+Problems+for+TopCoder
        • 14 лет назад, # ^ |
            Проголосовать: нравится +3 Проголосовать: не нравится
          Платят только составителям задач?
          • 14 лет назад, # ^ |
              Проголосовать: нравится +3 Проголосовать: не нравится
            какие-то деньги я вижу у срм-щиков(Algorithm Contest Payment) но мануала к сожалению я не находил подробнее об этом.
            • 14 лет назад, # ^ |
                Проголосовать: нравится +3 Проголосовать: не нравится
              А там и нет никакого мануала. Пишешь координатору что заинтересован делать задачи, он тебе если проходишь по критериям присылает договор - либо на автора задач, либо на тестера.
              • 14 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится
                А что именно делают тестеры?
                • 14 лет назад, # ^ |
                    Проголосовать: нравится +3 Проголосовать: не нравится
                  Во-первых, пишут альтернативные решения. Во-вторых, смотрят на тесты составленные автором задачи, возможно добавляют новые.
                • 14 лет назад, # ^ |
                    Проголосовать: нравится +9 Проголосовать: не нравится
                  У каждой задачи есть три части: условие, авторское решение и тесты.

                  Тестер должен проверить, чтобы все эти части были корректны, согласовались друг с другом, и чтобы они были качественными. Ну например, ограничения в условии должны согласоваться с авторским решением, которое не должно пропускать тесты, которые им не удовлетворяют. А сами тесты должны достаточно полно покрывать ограничения в условии.
          • 14 лет назад, # ^ |
              Проголосовать: нравится +3 Проголосовать: не нравится
            В общем случае - участникам СРМа не платят. Иногда (не помню уже, когда последний раз) проводят денежные СРМы. В них платят топ3 в комнатах в див1 и топ2 в комнатах див2
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Интересно, а какой понт тогда автору? Задачу запороть? Спасибо услышать? :)
      • 14 лет назад, # ^ |
          Проголосовать: нравится +6 Проголосовать: не нравится
        Опытным и хорошо зарекомендовавшим себя авторам действительно нет никакого "понту". А вот новичкам это будет полезно. Получат опыт подготовки СРМ (а там есть свои нюансы) и потом им будет проще заполучить для себы платный СРМ. То же самое и для тестеров.
      • 14 лет назад, # ^ |
          Проголосовать: нравится +3 Проголосовать: не нравится
         Это интересный и полезный опыт.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Эх, похоже не получится написать. На работе дел много
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
В чем идея Div-1 500? Судя по ограничениям в 15 бутылок, здесь надо использовать дп по маскам. Но вот только как...
  • 14 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    Расскажу свою идею, не хватило времени дописать, вероятно неправильная, у меня вообще туго с опровержением себя)

    Считаем дп по маскам, f[i]--максимальный профит от маски i бутылок.
    Также препроцессингом за 2^15 просчитаем массив a[i]--профит, если мы разольем маску i бутылок так, чтобы было максимально полных бутылок, одна частично(от 0 до c) заполненная, а остальные пустые.

    И как считаем--если у нас есть ответ для маски i, то мы перебираем все остальные маски, не пересекающиеся с i(для оптимизации я считал в новой "цепочке" мы будем всегда использовать самый левый нулевой бит маски i) и обновляем ответ f[mask | newmask]=max(f[mask |newmask],f[mask]+a[newmask])
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Вот решение. К сожалению, придумал я его уже после окончания контеста:
    public class KiwiJuice {
    public int theProfit(int C, int[] a, int[] p) {
    int n = a.length;
    int[] s = new int[1 << n];
    int[] q = new int[1 << n];
    for (int i = 0; i < (1 << n); i++) {
    q[i] = q[i >> 1] + (i & 1);
    for (int j = 0; j < n; j++) {
    if (((i >> j) & 1) != 0)
    s[i] += a[j];
    }
    }
    int[] ans = new int[1 << n];
    for (int i = 0; i < (1 << n); i++) {
    for (int j = i; j != 0; j = (j - 1) & i) {
    ans[i] = Math.max(ans[i], ans[i - j] + p[C] * (s[j] / C) + p[s[j] % C] + p[0] * (q[j] - 1 - s[j] / C));
    }
    }
    return ans[(1 << n) - 1];
    }
    }

  • 14 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится
    Основная идея в том что после переливания из одной бутылки в другую, у нас получится либо одна полная бутылка либо одна пустая. Переливать в пустую или переливать из полной бутылки нет никакого смысла, просто емкости двух бутылок поменяются местами.

    Фактически получается мы считаем максимальную прибыль, если мы уже использовали какой-то множество I бутылок и причем в одной активной бутылке из использованных находится K литров сока причем мы еще не посчитали прибыль за эту бутылку, объем сока еще может измениться в ней.
    Тогда для пересчета мы просто смотрим бутылку J которую мы не использовали и с ней мы можем сделать несколько операций:
    (dm[I][K] мы уже посчитатли. J не принадлежит I)
    -просто использовать, т.е. добавить прибыль за эту бутылку
     dm[I+(1 << J)][K] = max(dm[I+(1 << J)][K], prices[bottle[J]] + dm[I][K]);
    -сделать ее активной
     dm[I+(1 << J)][bottle[J]] = max(dm[I+(1 << J)][bottle[J]], prices[K] + dm[I][K]);
    -перелить в активную бутылку
    если bottle[j] + k < C
     dm[I + (1 << J)][botlle[J] + K] = max(dm[I + (1 << J)][botlle[J] + K], dm[I][K] + prices[0]);
    иначе
     dm[I + (1 << J)][botlle[J] + K - C] = max(dm[I + (1 << J)][botlle[J] + K], dm[I][K] + prices[C]);
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
Как в Div-2 делать вторую задачу?
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    суть в том что у нас каждый раз получаются числи вида: (2^n)*init+(2^n-1)
  • 14 лет назад, # ^ |
      Проголосовать: нравится +1 Проголосовать: не нравится
    Я писал bfs+map.
    • 14 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится
      Я также делал. Допустил глупейшую ошибку в итоге зацикливалось=(
      В практисе сразу же сдал, когда увидел оплошность
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Я так решал:

    1) x*4+3 и x*8+7 коммутируют между собой, то есть неважно в каком порядке выполнять операции, можно считать, что сначала мы делаем сколько-то операций первого типа, а потом сколько-то второго.

    2) ясно, что мы просто выполняет все операции в кольце вычетов по модулю 10^9+7. это всем известное простое число, ура =) значит мы можем делить на 4 и на 8.

    сделаем 100 000 обратных операций первого типа от нуля, запишем в мап, а потом 100 000 операций другого типа от числа init.
  • 14 лет назад, # ^ |
      Проголосовать: нравится +9 Проголосовать: не нравится
    В двоичной записи 4*x+3 это добавление двух единиц справа, 8*x+7 это добавление трёх единиц. Посмотрим сколько надо добавить единиц чтобы получить остаток 0, делаем x_new = 2*x+1 где-то 300000 раз. Пусть через K итераций мы получили остаток 0, значит ответ K/3 + (K%3==0?0:1). Только начинать надо сразу с двух итераций.
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
map это что?
14 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится
ето масив , но вместо обыкновенных индексов, выступают практически все типы данных С++.
Например:... map< string,int >a ...; Дальше в коде можна использовать a["one"] и прочее. Вообщем много хорошых вещей дает map.(поисчи в нете)
  • 14 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Ага, только я в шарпе использовал Dictionary
    Но я думаю это в принципе аналог)
    • 14 лет назад, # ^ |
        Проголосовать: нравится +2 Проголосовать: не нравится
      map в С++ - это красночерные деревья, а Dictionary в C# - это хеш.

      Это одно и тоже, если ты хочешь просто улучшать и получать значения по указанному ключу. А вот если ты хочешь найти значение для  наиболее близкого к заданному ключу, то Dictionary в C# не поможет, а в C++ ты можешь сказать "дай мне элемент из карты, ключ которого минимален из всех, которые не превышает данного", lower_bound, и я знаю сотни задач, которые этим решаются.
      В C# тоже есть деревья - SortedDictionary. Поразительный по своей бесполезности класс, потому что в нем нет метода LowerBound, который однозначно от него ожидается.
      • 14 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится
        Спасибо за информацию =)
      • 14 лет назад, # ^ |
          Проголосовать: нравится +5 Проголосовать: не нравится
        Насколько я понимаю, в Dictionary нельзя даже пройтись по элементам в отсортированном порядке.
        • 14 лет назад, # ^ |
            Проголосовать: нравится +5 Проголосовать: не нравится
          В Dictionary - нельзя, потому что это Хеш, он и не должен хранить в отсортированном порядке.
          В SortedDictionary конечно можно, обычным foreach.
      • 14 лет назад, # ^ |
          Проголосовать: нравится +7 Проголосовать: не нравится
        лол
        это не карта, это отображение
  • 14 лет назад, # ^ |
      Проголосовать: нравится -6 Проголосовать: не нравится
    Звучить заманчиво