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

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

Всем доброго времени суток! Недавно решал III (XIV) открытый командный студенческий чемпионат Поволжья по спортивному программированию, И у меня возникло пару вопросов. Вот один из них: Как найти в массиве два элемента xor которых минимален? Заранее спасибо!

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

»
13 лет назад, скрыть # |
← Rev. 6  
Проголосовать: нравится +8 Проголосовать: не нравится

Не знаю можно ли проще:

Переберем один из элементов. Для текущего элемента будем поддерживать побитовый бор для всех предыдущих элементов. Теперь пройдемся по бору, каждый раз стараясь уменьшить текущий разряд в результирующем числе. Из всех вариантов выбрать минимум. O(NlogN)

UPD: На самом деле это означает, что если числа отсортировать, то для какого-то фиксированного выгодно взять его соседа. Вот решение проще ))

UPD2: Ну значит все-таки бор :)

  • »
    »
    13 лет назад, скрыть # ^ |
    ← Rev. 3  
    Проголосовать: нравится 0 Проголосовать: не нравится

    В смысле "отсортировать?" просто по возрастанию? А для и наибольшего числа? Или имелось ввиду, что перебрав соседей для всех чисел, мы точно найдем оптимальный ответ?

    Просто минимальность xor'a зависит и от состава этих чисел как двоичных строк, и от порядка символов, так что с бором, наверное, проще всего.

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

      Да, я поспешил с сортировкой. Пока префиксы совпадают все верно, но если найдется отличие — там все плохо.

      • »
        »
        »
        »
        13 лет назад, скрыть # ^ |
        ← Rev. 2  
        Проголосовать: нравится 0 Проголосовать: не нравится

        Хотя я сдал sort и у меня зашло. На за бор спасибо, теперь буду знать как и максимум искать, его ведь точно так же, да? спасибо)

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

          Да, максимум можно бором.

          Решение с сортировкой нужно более пристально изучить. Например на следующем тесте:

          001 010 101

          Ответ будет правильным, но для последнего числа оптимальной парой будет не сосед.