Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет qwerty ([info]qwerty)
@ 2010-01-24 17:11:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Задачка

Есть одномерный массив целых. В начале его расположен массив A длиной a, в конце B длиной b, а посредине не интересующий нас мусор длиной c. Требуется красивым образом переместить B в начало, за ним расположить A, причем сделав при этом не более a+b чтений и записей в массив. Судьба мусора не интересует. Файлы, посторонняя память и рекурсия категорически отсутствуют.


(Читать комментарии) - (Добавить комментарий)


[info]qwerty
2010-01-26 15:39 (ссылка)
У автора имеется решение, удовлетворяющее всем критериям, кроме субъективного эстетического.

Ниже [info]blue_slonopotam@lj предлагает свое решение. Я пока не проверил, верное ли оно. Оно меня эстетически тоже не особенно вдохновляет вычислением Н.О.Д., но это-то наверняка поправимо.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]blue_slonopotam
2010-01-27 01:42 (ссылка)
Ты тоже не забудь показать, мне интересно.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]qwerty
2010-01-27 01:55 (ссылка)
У меня все на сложениях и вычитаниях с другим критерием завершения, но мне не нравится мой буфер на локале с флагом заполнения и разбор нескольких частных случаев перед. От флага могу избавиться хитрой проверкой, но красивее от этого не становится.

Собственно, GCD классически считается вычитаниями:
unsigned gcd(unsigned a, unsigned b) {
  if (a == 0) {
    return b;
  }
  while (b) {
    if (a > b) {
      a -= b;
    } else {
      b -= a;
    }
  }
  return a;
}

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]blue_slonopotam
2010-01-27 02:43 (ссылка)
"У автора имеется решение"

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

про НОД - зачем на каждом проходе цикла выяснять, кто больше, когда первый проход может сделать именно это, а дальше оно чередуется ? у тебя на процессоре деления с остатком нет ?

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]qwerty
2010-01-27 03:10 (ссылка)
Ну, все-таки, ты пока не предъявил программы, выполняющей не более a+b чтений и записей. Условия завершения пока разные, про мусор сказать еще ничего нельзя.

У меня нет вычисления НОД. Но подозреваю, что попутно производимые действия со сложениями и вычитаниями ему эквивалентны.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]blue_slonopotam
2010-01-27 03:13 (ссылка)
Мы с тобой быдлокодеры. Джаниторз митинг, не иначе.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]qwerty
2010-01-27 03:17 (ссылка)
Почему же сразу быдлокодеры? Просто в голове много заезженных паттернов застряло, они оттуда чуть что лезут. Но до TCHAR я пока не докатился, нет :)

(Ответить) (Уровень выше)


[info]tristes_tigres
2010-01-28 14:17 (ссылка)
выполняющей не более a+b чтений и записей.
См

(Ответить) (Уровень выше)


[info]ppkk
2010-01-27 18:33 (ссылка)
Я рассматривал способы расстановки с начала цепочками их по местам (то есть: обработать позиции 1…(a+b)):
1. Проверить, что это следует делать (ниже).
2. Сохранить значение с первого места, записать туда то (с места X), что полагается, посмотреть, куда надо записать то, что стояло на первом месте, если надо — сохранить и продолжать, если не надо — записать. На начальную позицию повторно не пишем, если до неё дошли.
3. Если не доходили до начальной позиции, то заполняем в обратном направлении, если требуется (писать на место X и т.п.).

Проверка, что это следует делать: идём по цепочкам, только проверяя индексы, не выполняя операций load/store. Если встретился индекс меньше исходного, то делать не надо.

Это некрасиво и долго (из-за большого количества лишних проверок), можно оптимизировать проверки, но получатся несимпатичные формулы из сравнений по модулю, в которых легко ошибиться, какое-то количество дополнительных локальных переменных. Но по количеству "важных" действий — порядок.

Требуемой красоты определённо не наблюдается: случаи разных соотношений a, b и c заметно отличаются. В случае c=0 формулы, например, могут быть проще (там будут циклы). Или в случае a=b, c=ka. В "олимпиадной задече" по [info]phantom-у, видимо, должны были бы стоять и "красивые" соотношения a, b и c…

(Ответить) (Уровень выше)


(Читать комментарии) -