Жизнь - это очень узкий мост
От: sugarde  
Дата: 23.10.08 16:38
Оценка: 23 (3)
1. Четыре человека разных лет подошли ночью с лампочкой к мосту.
Мост узкий, т.е. пройти по нему могут не более двух человек с лампой.

На прохождение моста каждому из путешественников нужно соотв. 1, 2, 5 и 10 мин. Пара двигается со скоростью более медленного.
Как пересечь мост по-быстрее?

2. Обобщить задачу для N-путников с t[1;N]. Найти эффективное решение или показать NP-полноту.
В жизни кaждoгo челoвекa бывaют приятные мoменты, кoгдa oн чувствует себя пoлным идиoтoм. Приятнoсть этих мoментoв в пoстижении истины.
Re: Жизнь - это очень узкий мост
От: RomikT Германия  
Дата: 23.10.08 16:53
Оценка:
Здравствуйте, sugarde, Вы писали:

S>1. Как пересечь мост по-быстрее?

Вроде, быстрее чем за 17 минут не получится.

Над доказательством (не переборным ) и вторым вопросом пока думаю.
Re: Жизнь - это очень узкий мост
От: samius Япония http://sams-tricks.blogspot.com
Дата: 23.10.08 16:56
Оценка:
Здравствуйте, sugarde, Вы писали:

S>1. Четыре человека разных лет подошли ночью с лампочкой к мосту.

S>Мост узкий, т.е. пройти по нему могут не более двух человек с лампой.

S>На прохождение моста каждому из путешественников нужно соотв. 1, 2, 5 и 10 мин. Пара двигается со скоростью более медленного.

S>Как пересечь мост по-быстрее?
Мои перешли за 17 мин. Хочется увидеть другие решения, пока свое придержу...

S>2. Обобщить задачу для N-путников с t[1;N]. Найти эффективное решение или показать NP-полноту.

Ой лениво... Но NP полноты не будет.
Re[2]: Жизнь - это очень узкий мост
От: samius Япония http://sams-tricks.blogspot.com
Дата: 23.10.08 16:58
Оценка:
P.S. Задачка эта мне уже встречалась, только там была река, лодка и братья
Re[2]: Жизнь - это очень узкий мост
От: sugarde  
Дата: 23.10.08 16:58
Оценка:
Здравствуйте, samius, Вы писали:

S>>2. Обобщить задачу для N-путников с t[1;N]. Найти эффективное решение или показать NP-полноту.

S>Ой лениво... Но NP полноты не будет.
С одной стороны, чувтвуется, что есть какое-то дин.прог решение, с другой подозрительная задачка.
Тоже думаю.
В жизни кaждoгo челoвекa бывaют приятные мoменты, кoгдa oн чувствует себя пoлным идиoтoм. Приятнoсть этих мoментoв в пoстижении истины.
Re: Жизнь - это очень узкий мост
От: codelord  
Дата: 24.10.08 05:02
Оценка:
Здравствуйте, sugarde, Вы писали:

S>1. Четыре человека разных лет подошли ночью с лампочкой к мосту.

S>Мост узкий, т.е. пройти по нему могут не более двух человек с лампой.

S>На прохождение моста каждому из путешественников нужно соотв. 1, 2, 5 и 10 мин. Пара двигается со скоростью более медленного.

S>Как пересечь мост по-быстрее?

S>2. Обобщить задачу для N-путников с t[1;N]. Найти эффективное решение или показать NP-полноту.



Сначала идут номера
1,2 — проходят за 2 минуты
потом
5,10 проходят за 10 минут

итого 12 минут.
Re[2]: Жизнь - это очень узкий мост
От: codelord  
Дата: 24.10.08 05:13
Оценка:
Здравствуйте, codelord, Вы писали:

C>Здравствуйте, sugarde, Вы писали:


S>>1. Четыре человека разных лет подошли ночью с лампочкой к мосту.

S>>Мост узкий, т.е. пройти по нему могут не более двух человек с лампой.

S>>На прохождение моста каждому из путешественников нужно соотв. 1, 2, 5 и 10 мин. Пара двигается со скоростью более медленного.

S>>Как пересечь мост по-быстрее?

S>>2. Обобщить задачу для N-путников с t[1;N]. Найти эффективное решение или показать NP-полноту.



C>Сначала идут номера

C>1,2 — проходят за 2 минуты
C>потом
C>5,10 проходят за 10 минут

C>итого 12 минут.


или я не понял условие или для любого количества решением будет:
сортировка по времени и выход по парам начиная с конца сортированного списка т/е
имеем время проходов
20 60 80 1 2 555 30 21
сначала сортируем
1 2 20 21 30 60 80 555
и выпускаем
80 — 555
30 — 60
20 — 21
1 — 2
если остается последний ( нечетный список значит идет последним один )
получаем минимальное время прохода пар
Re: Жизнь - это очень узкий мост
От: codelord  
Дата: 24.10.08 05:17
Оценка:
Здравствуйте, sugarde, Вы писали:

S>1. Четыре человека разных лет подошли ночью с лампочкой к мосту.

S>Мост узкий, т.е. пройти по нему могут не более двух человек с лампой.

S>На прохождение моста каждому из путешественников нужно соотв. 1, 2, 5 и 10 мин. Пара двигается со скоростью более медленного.

S>Как пересечь мост по-быстрее?

S>2. Обобщить задачу для N-путников с t[1;N]. Найти эффективное решение или показать NP-полноту.


Ну я так и думал, видимо лампу надо вернуть и она у них одна,
Но про это никто не сказал

т/е решения выше не подходят
Re[2]: Жизнь - это очень узкий мост
От: carpenter СССР  
Дата: 24.10.08 05:34
Оценка:
Здравствуйте, samius, Вы писали:


S>Мои перешли за 17 мин.


Согласен
Re: Жизнь - это очень узкий мост
От: Socrat Россия  
Дата: 24.10.08 05:45
Оценка: +1
Здравствуйте, sugarde, Вы писали:

S>1. Четыре человека разных лет подошли ночью с лампочкой к мосту.

S>Мост узкий, т.е. пройти по нему могут не более двух человек с лампой.

S>На прохождение моста каждому из путешественников нужно соотв. 1, 2, 5 и 10 мин. Пара двигается со скоростью более медленного.

S>Как пересечь мост по-быстрее?

Самый быстрый бегает по мосту взад-вперед и переводит всех.

S>2. Обобщить задачу для N-путников с t[1;N]. Найти эффективное решение или показать NP-полноту.
Re[2]: Жизнь - это очень узкий мост
От: RomikT Германия  
Дата: 24.10.08 05:53
Оценка:
Здравствуйте, Socrat, Вы писали:

S>Самый быстрый бегает по мосту взад-вперед и переводит всех.

Это, очевидно, неправильно. Таким образом даже задача 1 не решается (получится больше 17 минут).
Re[2]: Жизнь - это очень узкий мост
От: codelord  
Дата: 24.10.08 06:01
Оценка:
Здравствуйте, Socrat, Вы писали:
S>Самый быстрый бегает по мосту взад-вперед и переводит всех.

Это наверное решение допустим имеем

1 5 30 60 120
тогда по вашему решению
результат будет
5 + 30 + 60 + 120 + 1 + 1 + 1 + 1 + 1 + 1 + 1
итого : 222

а более быстрым будет вариант
1 5 ( -> 1 ) та сторона ( 5 ) (эта сторона 1 30 60 120 )
60 120 ( -> 5 ) ( 60 120 ) ( 1 5 30 )
30 5 ( -> 5 ) ( 60 120 30 ) ( 1 5 )
1 5 ( 60 120 30 1 5 ) ( )
итого времени:
5 + 1 + 120 + 5 + 30 + 5 + 5
результат : 171
Re: Жизнь - это очень узкий мост
От: carpenter СССР  
Дата: 24.10.08 06:01
Оценка:
Здравствуйте, sugarde, Вы писали:

Первая задачка — по легенде задавалась в майкрософте на собеседовании
Re[3]: Жизнь - это очень узкий мост
От: Socrat Россия  
Дата: 24.10.08 06:03
Оценка: 15 (1)
Здравствуйте, RomikT, Вы писали:


S>>Самый быстрый бегает по мосту взад-вперед и переводит всех.

RT>Это, очевидно, неправильно. Таким образом даже задача 1 не решается (получится больше 17 минут).

Действительно, погорячился. Надо двух самых быстрых использовать, чтобы лампу относить назад, а самых медленных группировать парами...
Re[4]: Жизнь - это очень узкий мост
От: carpenter СССР  
Дата: 24.10.08 06:10
Оценка:
Здравствуйте, Socrat, Вы писали:

S>Здравствуйте, RomikT, Вы писали:



S>>>Самый быстрый бегает по мосту взад-вперед и переводит всех.

RT>>Это, очевидно, неправильно. Таким образом даже задача 1 не решается (получится больше 17 минут).

S>Действительно, погорячился. Надо двух самых быстрых использовать, чтобы лампу относить назад, а самых медленных группировать парами...


верной дорогой идете товарищь
Re: Жизнь - это очень узкий мост
От: Константин Л.  
Дата: 24.10.08 08:36
Оценка:
Здравствуйте, sugarde, Вы писали:

S>1. Четыре человека разных лет подошли ночью с лампочкой к мосту.

S>Мост узкий, т.е. пройти по нему могут не более двух человек с лампой.

S>На прохождение моста каждому из путешественников нужно соотв. 1, 2, 5 и 10 мин. Пара двигается со скоростью более медленного.

S>Как пересечь мост по-быстрее?

17 минут (задача от MS):

-> — туда

<- — назад

->1+2 (2)

<-2 (2)
->10+5 (10)
<-1 (1)
->1+2 (2)


S>2. Обобщить задачу для N-путников с t[1;N]. Найти эффективное решение или показать NP-полноту.

Re[2]: Жизнь - это очень узкий мост
От: gbear Россия  
Дата: 24.10.08 08:40
Оценка:
Здравствуйте, samius, Вы писали:

S>>2. Обобщить задачу для N-путников с t[1;N]. Найти эффективное решение или показать NP-полноту.

S>Ой лениво... Но NP полноты не будет.

Обобщить как раз довольно таки просто...

сортируем всех N путников по времени прохождения.
Первые два ... т.е. пара самых быстрых будут т.н. перевозчиками. Их задача переносить лампу с одного конца на другой за минимальное возможное время.

Алгоритм перевозки такой.
0. i=0.
1. Перевозчики переходят мост.
2. Самый быстрый из перевозчиков идет обратно.
3. Мост переходит пара N-2i, N-(2i+1).
4. Оставшийся перевозчик идет обратно с лампой.
5. i=i+1.
6. Если остались пары не перевозчиков, идем на шаг 1.
7. Если осталася непарный "тормоз". Самый быстрый из перевозчиков переходит с ним мост и возвращается обратно.
8. Пара перевозчиков переходит мост. Конец.

NP полноты действительно нет.

---
С уважением, Сиваков Константин.
Re: Жизнь - это очень узкий мост
От: wallaby  
Дата: 24.10.08 08:49
Оценка: 1 (1)
Здравствуйте, sugarde, Вы писали:

[..]

S>2. Обобщить задачу для N-путников с t[1;N]. Найти эффективное решение или показать NP-полноту.


ИМХО всё сводится к тому как лучше перевести двух самых медленных из оставшихся. Есть 2 разумных подхода:

1) Самый быстрый последовательно переводит обоих самых медленных и возвращается назад с лампой.
2) Двое самых быстрых переходят с лампой, потом один возвращает лампу назад, с этой лампой переходят двое самых медленных после чего второй быстрый возвращает лампу назад.

На каждом шаге определяется, какой из вариантов эффективнее.
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
Re[3]: Жизнь - это очень узкий мост
От: RomikT Германия  
Дата: 24.10.08 08:58
Оценка:
Здравствуйте, gbear, Вы писали:

G>Алгоритм перевозки такой...

Алгоритм, видимо, неправильный, так как не работает для [102, 104, 105, 108]
Re[4]: Жизнь - это очень узкий мост
От: gbear Россия  
Дата: 24.10.08 09:26
Оценка:
Здравствуйте, RomikT, Вы писали:

RT>Здравствуйте, gbear, Вы писали:


G>>Алгоритм перевозки такой...

RT>Алгоритм, видимо, неправильный, так как не работает для [102, 104, 105, 108]

1. 102 и 104 переходять мост.
2. 102 возращается.
3. 105 и 108 переходят мост.
4. 104 возвращается.
5. 102 и 104 переходят мост.

И того:

104
102
108
104
104

Есть способ быстрее?

--
С уважением, Сиваков Константин.
Re[2]: Жизнь - это очень узкий мост
От: gbear Россия  
Дата: 24.10.08 09:42
Оценка:
Здравствуйте, wallaby, Вы писали:

W>ИМХО всё сводится к тому как лучше перевести двух самых медленных из оставшихся. Есть 2 разумных подхода:


W>1) Самый быстрый последовательно переводит обоих самых медленных и возвращается назад с лампой.

W>2) Двое самых быстрых переходят с лампой, потом один возвращает лампу назад, с этой лампой переходят двое самых медленных после чего второй быстрый возвращает лампу назад.

W>На каждом шаге определяется, какой из вариантов эффективнее.


Кстати да... например при [1, 10, 10, 10] первый способ эффективней.

---
С уважением, Сиваков Константин.
Re[2]: Жизнь - это очень узкий мост
От: wallaby  
Дата: 24.10.08 10:14
Оценка:
Здравствуйте, wallaby, Вы писали:

W>ИМХО всё сводится к тому как лучше перевести двух самых медленных из оставшихся. Есть 2 разумных подхода:


W>1) Самый быстрый последовательно переводит обоих самых медленных и возвращается назад с лампой.

W>2) Двое самых быстрых переходят с лампой, потом один возвращает лампу назад, с этой лампой переходят двое самых медленных после чего второй быстрый возвращает лампу назад.

W>На каждом шаге определяется, какой из вариантов эффективнее.


Более точно так:

цикл
  если эффективнее первый вариант, самый быстрый переводит одного самого медленного и возвращается
  если эффективнее второй вариант, переводятся двое самых медленных по второму варианту
конец цикла


но гарантии что в итоге мы получим наименьшее время нет — не исключено, что даже если второй вариант эффективнее в итоге если проанализировать всё до конца окажется лучше сначала перевести самого медленного. Ситуация напоминает известную проблему в алгоритме сжатия LZ77 (eg, Deflate), когда приходится искать компромисс между скоростью работы и качеством сжатия.
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
Re[5]: Жизнь - это очень узкий мост
От: ghost92  
Дата: 24.10.08 10:48
Оценка: 1 (1)
Здравствуйте, gbear, Вы писали:

G>Здравствуйте, RomikT, Вы писали:


RT>>Здравствуйте, gbear, Вы писали:


G>>>Алгоритм перевозки такой...

RT>>Алгоритм, видимо, неправильный, так как не работает для [102, 104, 105, 108]

102 водит всех
итого получится
104 + 102 + 105 + 102 + 108 = 521

в твоем варианте
104 + 102 + 108 + 104 + 104 = 522

G>1. 102 и 104 переходять мост.

G>2. 102 возращается.
G>3. 105 и 108 переходят мост.
G>4. 104 возвращается.
G>5. 102 и 104 переходят мост.

G>И того:


G>104

G>102
G>108
G>104
G>104

G>Есть способ быстрее?


G>--

G>С уважением, Сиваков Константин.
Re[2]: Жизнь - это очень узкий мост
От: ghost92  
Дата: 24.10.08 10:56
Оценка:
Здравствуйте, wallaby, Вы писали:

W>Здравствуйте, sugarde, Вы писали:


W>[..]


S>>2. Обобщить задачу для N-путников с t[1;N]. Найти эффективное решение или показать NP-полноту.


W>ИМХО всё сводится к тому как лучше перевести двух самых медленных из оставшихся. Есть 2 разумных подхода:


W>1) Самый быстрый последовательно переводит обоих самых медленных и возвращается назад с лампой.

W>2) Двое самых быстрых переходят с лампой, потом один возвращает лампу назад, с этой лампой переходят двое самых медленных после чего второй быстрый возвращает лампу назад.

W>На каждом шаге определяется, какой из вариантов эффективнее.


выделим двух самых шустрых. (T1, T2)
они будут переводить людей на другую сторону. (T3, T4)
1ый способ эффективнее если T2 + T2 > T1 + T3

но как оптимально бить на пары?
к тому же людей может быть нечетное кол-во
Re: Жизнь - это очень узкий мост
От: Cider Россия  
Дата: 24.10.08 11:06
Оценка:
Здравствуйте, sugarde, Вы писали:

S>1. Четыре человека разных лет подошли ночью с лампочкой к мосту.

S>Мост узкий, т.е. пройти по нему могут не более двух человек с лампой.

Опять гора Фудзи
Cider
Re: Жизнь - это очень узкий мост
От: gbear Россия  
Дата: 24.10.08 11:24
Оценка:
Здравствуйте, sugarde, Вы писали:

S>2. Обобщить задачу для N-путников с t[1;N]. Найти эффективное решение или показать NP-полноту.


Пробуем обощить...

Выделим из всей совокупности путников дух самых быстрых... x и у. При чем t(x) <= t(y).

Очевидно, что решение всегда будет начинаться с того, что выполняется переход x и y. После чего, х возращается с лампой обратно.

Время такого шага t(y) + t(x).

Опишем следующий за первым переходом выбор:
Необходимо решить, пойдет ли сейчас через мост пара самых медленных, или самый быстрый поведет одного самого медленного. При этом очевидно, что с той стороны моста лампу принесет самый быстрый. В первом случае это будет y, а во втором x.

Выделим из множетва не перешедших мост двух самых медленных i и j. При этом t(i) => t(j).
Очевидно, t(x) <= t(y) <= t(j) <= t(i).

В случае перехода i и j время перехода будет выражаться как:
переход пары + возврат лампы + очевидный переход x и y /*/ + возврат лампы.
Т.е. t(i) + t(y) + t(y) + t(x).

В случае перехода x и i время перехода i и j будет выражаться как:
переход x и i + возврат лампы + переход x и j /**/ + возврат лампы.
t(i) + t(x) + t(j) + t(x).

Т.е. если t(x) + t(j) > 2t(y) выгодней первый вариант, иначе — второй.

*
После того как y перенес лампу, на той стороне моста остались путники время перехода которых выше чем t(x) и t(y).
Очевидно t(y) + t(x) — минимальное время добиться минимального времени последующего возврата лампы.

**
На самом деле этот переход не очевиден, и будет осуществлен только в том случае если для него выполняется
t(x) + t(k) <= 2t(y), где k следующий за j по медленности времени перехода путник.

---
С уважением, Сиваков Константин.
Re[2]: Жизнь - это очень узкий мост
От: sugarde  
Дата: 24.10.08 12:37
Оценка:
Рост полного пространства решений у меня какой-то очень суровый.

Каждый ход состоит из двух полуходов.

Пространство для i-полухода направо: (n — i)(n — i — 1)/2
Для i-полухода направо: i + 2

Всего PRODUCT[i=0..n-3]((n-i)*(n-i-1)*(i+2)/2) т.е. (лень маятся с -1) O((n!)^3/2^n) или типа того.

Написал перебиралку c B&B. Суровый рост.
Очевидна верхняя граница: (n-3)*min + sum (шустрик водит толстяков).
В жизни кaждoгo челoвекa бывaют приятные мoменты, кoгдa oн чувствует себя пoлным идиoтoм. Приятнoсть этих мoментoв в пoстижении истины.
Re[3]: Жизнь - это очень узкий мост
От: sugarde  
Дата: 24.10.08 12:48
Оценка: 7 (2)
Здравствуйте, codelord, Вы писали:


C>1 5 30 60 120

C>тогда по вашему решению
C>результат будет
C>5 + 30 + 60 + 120 + 1 + 1 + 1 + 1 + 1 + 1 + 1
C>итого : 222

C>а более быстрым будет вариант

C>1 5 ( -> 1 ) та сторона ( 5 ) (эта сторона 1 30 60 120 )
C>60 120 ( -> 5 ) ( 60 120 ) ( 1 5 30 )
C>30 5 ( -> 5 ) ( 60 120 30 ) ( 1 5 )
C>1 5 ( 60 120 30 1 5 ) ( )
C>итого времени:
C>5 + 1 + 120 + 5 + 30 + 5 + 5
C>результат : 171

Перебор нашел решение: (1,5)(1)(1,30)(1)(60,120)(5)(1,5)
С результатом 167.
Т.е. наводит на мысль о смешении решений (толстые парочками, шустрики носят лампу) и (шустрик водит толстяков).
В жизни кaждoгo челoвекa бывaют приятные мoменты, кoгдa oн чувствует себя пoлным идиoтoм. Приятнoсть этих мoментoв в пoстижении истины.
Re: Жизнь - это очень узкий мост
От: Кодт Россия  
Дата: 24.10.08 12:50
Оценка:
Здравствуйте, sugarde, Вы писали:

S>2. Обобщить задачу для N-путников с t[1;N]. Найти эффективное решение или показать NP-полноту.


пока N >= 4
  туда t[1],t[2]
  обратно t[1]  -- или t[2], без разницы
  туда t[N-1],t[N]
  обратно t[2]  -- или t[1], соответственно
  N := N-2
если N == 3
  туда t[1],t[3]
  обратно t[1]
  N := 2
если N == 2
  туда t[1],t[2]
  N := 0
если N == 1
  туда t[1]
  N := 0
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[2]: Жизнь - это очень узкий мост
От: Кодт Россия  
Дата: 24.10.08 13:14
Оценка:
К>
К>пока N >= 4
К>  туда t[1],t[2]
К>  обратно t[1]  -- или t[2], без разницы
К>  туда t[N-1],t[N]
К>  обратно t[2]  -- или t[1], соответственно
К>  N := N-2
К>


Опаньки! Оказывается, здесь возможны варианты.

t1,t2 ->
t1 <-
t3,t4 ->
t2 <-

либо

t1,t4 ->
t1 <-
t1,t3 ->
t1 <-

разница: t2+t2 против t1+t3

Таким образом, нужно делать проверку и принимать решение.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[3]: Жизнь - это очень узкий мост
От: ghost92  
Дата: 24.10.08 13:54
Оценка:
Здравствуйте, Кодт, Вы писали:

К>>
К>>пока N >= 4
К>>  туда t[1],t[2]
К>>  обратно t[1]  -- или t[2], без разницы
К>>  туда t[N-1],t[N]
К>>  обратно t[2]  -- или t[1], соответственно
К>>  N := N-2
К>>


К>Опаньки! Оказывается, здесь возможны варианты.


К>t1,t2 ->

К>t1 <-
К>t3,t4 ->
К>t2 <-

К>либо


К>t1,t4 ->

К>t1 <-
К>t1,t3 ->
К>t1 <-

К>разница: t2+t2 против t1+t3


К>Таким образом, нужно делать проверку и принимать решение.


А как разбивать на пары???
Может быть более грамотное разбиение(чем банальные пары соседей в отсортированном массиве) приведет к другому выбору.
Вообще 2ой случай t1 + t3 можно рассмотреть как отдельный перевод 2 независимых тихоней самым шустрым чуваком.
И после этого может быть снова стоит задуматься о новом разбиении на пары.
Re: Жизнь - это очень узкий мост
От: wallaby  
Дата: 24.10.08 14:24
Оценка:
Здравствуйте, sugarde, Вы писали:

S>1. Четыре человека разных лет подошли ночью с лампочкой к мосту.

S>Мост узкий, т.е. пройти по нему могут не более двух человек с лампой.

S>На прохождение моста каждому из путешественников нужно соотв. 1, 2, 5 и 10 мин. Пара двигается со скоростью более медленного.

S>Как пересечь мост по-быстрее?

S>2. Обобщить задачу для N-путников с t[1;N]. Найти эффективное решение или показать NP-полноту.


Минимальное время перехода даст такая функция, рекурсивно перебирающая все возможные сочетания 2-х основных примитивов:

function FindTime(const Times: array of Cardinal): Cardinal;
var
  Time1: Cardinal;
  Time2: Cardinal;
  NextTimes: array of Cardinal;

begin
  case Length(Times) of
    0: Result:= 0;
    1: Result:= Times[0];
    2: Result:= Times[1];
    3: Result:= Times[0] + Times[1] + Times[2];
  else
// шустрый переводит тормоза
    SetLength(NextTimes, Length(Times) - 1);
    Move(Times[0], NextTimes[0], (Length(Times) - 1) * SizeOf(Cardinal));
    Time1:= Times[0] + Times[Length(Times) - 1] + FindTime(NextTimes);
// переходит пара тормозов
    SetLength(NextTimes, Length(Times) - 2);
    Move(Times[0], NextTimes[0], (Length(Times) - 2) * SizeOf(Cardinal));
    Time2:= Times[0] + 2 * Times[1] + Times[Length(Times) - 1]
      + FindTime(NextTimes);
    if Time1 < Time2
      then Result:= Time1
      else Result:= Time2;
  end;
end;


В частности, FindTime([1, 2, 5, 10]) = 17.
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
Re[2]: Жизнь - это очень узкий мост
От: ghost92  
Дата: 24.10.08 15:02
Оценка:
Здравствуйте, wallaby, Вы писали:

1. Аля метод грубой силы.
На 100000 то поди уже загнется
2. Не совсем понятно почему эти примитивы обеспечивают полноту решений.
3. Если не ошибаюсь то следующий алгоритм будет работать на порядок быстрее и будет выдавать тот же результат.
считаем что массивчик уже отсортирован.
делим его на 2 части по времени.
Ti > 2*T2 — T1. (тормоза)
Ti <= 2*T2 — T1. (шустрики)
T1, T2 мегашустрики
делим тормозов на пары начиная с конца. если останется 1 без пары приравниваем его к шустрикам.
переводим тормозов с помощью мегашустриков.
затем обычных шустриков первый переводит лично.
похоже на минимум надо чуть подумать.




W>Здравствуйте, sugarde, Вы писали:


S>>1. Четыре человека разных лет подошли ночью с лампочкой к мосту.

S>>Мост узкий, т.е. пройти по нему могут не более двух человек с лампой.

S>>На прохождение моста каждому из путешественников нужно соотв. 1, 2, 5 и 10 мин. Пара двигается со скоростью более медленного.

S>>Как пересечь мост по-быстрее?

S>>2. Обобщить задачу для N-путников с t[1;N]. Найти эффективное решение или показать NP-полноту.


W>Минимальное время перехода даст такая функция, рекурсивно перебирающая все возможные сочетания 2-х основных примитивов:


W>
W>function FindTime(const Times: array of Cardinal): Cardinal;
W>var
W>  Time1: Cardinal;
W>  Time2: Cardinal;
W>  NextTimes: array of Cardinal;

W>begin
W>  case Length(Times) of
W>    0: Result:= 0;
W>    1: Result:= Times[0];
W>    2: Result:= Times[1];
W>    3: Result:= Times[0] + Times[1] + Times[2];
W>  else
W>// шустрый переводит тормоза
W>    SetLength(NextTimes, Length(Times) - 1);
W>    Move(Times[0], NextTimes[0], (Length(Times) - 1) * SizeOf(Cardinal));
W>    Time1:= Times[0] + Times[Length(Times) - 1] + FindTime(NextTimes);
W>// переходит пара тормозов
W>    SetLength(NextTimes, Length(Times) - 2);
W>    Move(Times[0], NextTimes[0], (Length(Times) - 2) * SizeOf(Cardinal));
W>    Time2:= Times[0] + 2 * Times[1] + Times[Length(Times) - 1]
W>      + FindTime(NextTimes);
W>    if Time1 < Time2
W>      then Result:= Time1
W>      else Result:= Time2;
W>  end;
W>end;
W>


W>В частности, FindTime([1, 2, 5, 10]) = 17.
Re[2]: Жизнь - это очень узкий мост
От: wallaby  
Дата: 24.10.08 15:18
Оценка:
С функцией Slice будет короче:

function FindTime2(const Times: array of Cardinal): Cardinal;
var
  Time1: Cardinal;

begin
  case Length(Times) of
    0: Result:= 0;
    1: Result:= Times[0];
    2: Result:= Times[1];
    3: Result:= Times[0] + Times[1] + Times[2];
  else
// шустрый переводит тормоза
    Time1:= Times[0] + Times[Length(Times) - 1]
                     + FindTime(Slice(Times, Length(Times) - 1));
// переходит пара тормозов
    Result:= Times[0] + 2 * Times[1] + Times[Length(Times) - 1]
                     + FindTime(Slice(Times, Length(Times) - 2));
    if Time1 < Result
      then Result:= Time1;
  end;
end;
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
Re[3]: Жизнь - это очень узкий мост
От: wallaby  
Дата: 24.10.08 15:27
Оценка:
Здравствуйте, ghost92, Вы писали:

G>1. Аля метод грубой силы.


Наверняка можно усовершенствовать, не в этом дело — главное действительно ли он даёт минимальное время.

G>2. Не совсем понятно почему эти примитивы обеспечивают полноту решений.


Предложите контрпример.
ИМХО, быстрее чем с помощью этих примитивов перейти нельзя (максимум что возможно — за то же время).
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
Re[4]: Жизнь - это очень узкий мост
От: Кодт Россия  
Дата: 24.10.08 15:46
Оценка:
Здравствуйте, ghost92, Вы писали:

G>А как разбивать на пары???

G>Может быть более грамотное разбиение(чем банальные пары соседей в отсортированном массиве) приведет к другому выбору.
G>Вообще 2ой случай t1 + t3 можно рассмотреть как отдельный перевод 2 независимых тихоней самым шустрым чуваком.
G>И после этого может быть снова стоит задуматься о новом разбиении на пары.

Мысли неспешно текут в сторону кода Хаффмана... Но очень неспешно...
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[5]: Жизнь - это очень узкий мост
От: wallaby  
Дата: 24.10.08 15:56
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Мысли неспешно текут в сторону кода Хаффмана... Но очень неспешно...


Мимо. Как связать код Хаффмана с переводом тормоза шустриком?
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
Re[6]: Жизнь - это очень узкий мост
От: sugarde  
Дата: 24.10.08 15:59
Оценка:
Здравствуйте, wallaby, Вы писали:

К>>Мысли неспешно текут в сторону кода Хаффмана... Но очень неспешно...


W>Мимо. Как связать код Хаффмана с переводом тормоза шустриком?

Там тоже операции на самых толстых
Тут весь вопрос, работает ли greedy или нет.
В жизни кaждoгo челoвекa бывaют приятные мoменты, кoгдa oн чувствует себя пoлным идиoтoм. Приятнoсть этих мoментoв в пoстижении истины.
Re[7]: Жизнь - это очень узкий мост
От: wallaby  
Дата: 24.10.08 16:17
Оценка:
Здравствуйте, sugarde, Вы писали:

S>Тут весь вопрос, работает ли greedy или нет.


Да нет, greedy/lazy — это из LZ77. В коде Хаффмана символы собираются в пары по толщине (частоте появления в тексте), а связи худых с толстыми не просматривается.
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
Re[4]: Жизнь - это очень узкий мост
От: Vintik_69 Швейцария  
Дата: 24.10.08 17:50
Оценка: 10 (1)
Здравствуйте, wallaby, Вы писали:


G>>2. Не совсем понятно почему эти примитивы обеспечивают полноту решений.


W>Предложите контрпример.

W>ИМХО, быстрее чем с помощью этих примитивов перейти нельзя (максимум что возможно — за то же время).

Ну, если можно доказать, что туда-сюда ходит все время конечное число человек, то решение динамикой, вроде бы очевидно. Под конечным числом имеется в виду, что существует M, такое, что для любого N макисмальный номер возвращающегося человека не больше M (люди отсортированы по возрастанию времени).
Re[5]: Жизнь - это очень узкий мост
От: sugarde  
Дата: 24.10.08 18:01
Оценка:
Здравствуйте, Vintik_69, Вы писали:

Листаю список NPC с идеей добавить супер-шустриков с нуль-переходом и решить, скажем BIN PACKING.

А как в твоей динамике доказать, что тормоза гарантированные невозвращенцы?
т.е. ага нам нужно послать назад кого-то с лампочкой. Этот кто-то ещё вернётся.

Он перенесёт лампу и затратит своё время. На возвращение ему понадобится как-минимум своё время.
Итог — пусть назад бежит всегда самый шустрый с правой стороны. Один факториал ушел!
В жизни кaждoгo челoвекa бывaют приятные мoменты, кoгдa oн чувствует себя пoлным идиoтoм. Приятнoсть этих мoментoв в пoстижении истины.
Re[6]: Жизнь - это очень узкий мост
От: Vintik_69 Швейцария  
Дата: 24.10.08 18:39
Оценка:
Здравствуйте, sugarde, Вы писали:

S>Он перенесёт лампу и затратит своё время. На возвращение ему понадобится как-минимум своё время.


Это достаточно очевидный факт. То есть всегда существует i такое что все aj (j<=i) возвращаются, а aj (j>i) нет. Вопрос заключается в том, зависит ли это i от N или нет. Если не зависит, то решаем динамикой за O(N*2^i), а если зависит, то надо думать.
Re[4]: Жизнь - это очень узкий мост
От: Кодт Россия  
Дата: 24.10.08 18:54
Оценка:
Здравствуйте, ghost92, Вы писали:

G>А как разбивать на пары???

G>Может быть более грамотное разбиение(чем банальные пары соседей в отсортированном массиве) приведет к другому выбору.
G>Вообще 2ой случай t1 + t3 можно рассмотреть как отдельный перевод 2 независимых тихоней самым шустрым чуваком.
G>И после этого может быть снова стоит задуматься о новом разбиении на пары.

Маленькая эврика. Динамическое программирование и линейная сложность.

Сперва примем лемму, что общее направление работ — всё-таки в порядке убывания, а не вперемешку.
Действительно, если есть операция "туда t[N-k], t[N]", то предпочтительнее выбрать k=1 — это приведёт как минимум к не худшему состоянию.
Но сейчас я её доказывать не буду, чтоб не закопаться.

Итак.
Имеем операции:
— одноходовку "туда t[1],t[N]; обратно t[1]"
— двухходовку "туда t[1],t[2]; обратно t[1]" + "туда t[N-1],t[N]; обратно t[2]"
— завершающий ход "туда t[1],t[2]" либо "туда t[1],t[3]"
Обозначим их кодами 'mov', 'push'+'pop', 'ret0', 'ret1'.

Программа действий — это строка из команд, вот в такой автоматной грамматике
outside, 'mov'  -> outside
outside, 'push' -> inside
inside,  'mov'  -> inside
inside,  'pop'  -> outside
outside, 'ret0' -> finish
inside,  'ret1' -> finish


Применяя программу к нашему набору t[N],t[N-1],..., в момент, когда на левом берегу остались t[K] и младше, наша программа
— потратила какое-то суммарное время
— находится в одном из двух состояний: либо "вне двухходовки", либо "внутри двухходовки".

Таким образом, для каждого значения K и обоих состояний мы можем найти наилучшее время и соответсвующую наилучшую головную часть программы.
Дальнейшее очевидно
Держим вектор наилучших результатов для текущего K и из него получаем вектор наилучших результатов для K-1.
Начинаем с вектора для N (outside -> T=0,P=''; inside -> T=+oo,P='')
Приходим к вектору для 2 (outside,inside)
И из него приходим к точке (1,finish)



Поскольку двухходовки делать вложенными (на нулевом уровне бегают t[1],t[2]; на первом — t[1],t[3]; и т.д.)
то автомат у нас уже получается стековый, а число состояний — до N-2.

А это уже квадратичная сложность.
Но всяко не экспонента.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[5]: Жизнь - это очень узкий мост
От: wallaby  
Дата: 24.10.08 20:24
Оценка:
Здравствуйте, Vintik_69, Вы писали:

V_>Ну, если можно доказать, что туда-сюда ходит все время конечное число человек...


А что тут доказывать? Туда-сюда имеет смысл ходить только двум самым шустрым — любое возвращение более медленного приведёт к увеличению общего времени перехода. Если же есть ещё столь же шустрые как и второй, то они не улучшат результат — поэтому можно считать что возвращаются не более 2 человек.
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
Re[6]: Жизнь - это очень узкий мост
От: sugarde  
Дата: 24.10.08 21:42
Оценка:
Здравствуйте, wallaby, Вы писали:

Ясно. Угу. Интуитивно, дошли.

Итого O(n*logn) на сортировку да динамическое программирование:
T[n] = min(t[1] + t[0] + t[n-1] + t[1] + T[n-2], t[n-1] + t[0] + T[n-1])
Как-то так.
В жизни кaждoгo челoвекa бывaют приятные мoменты, кoгдa oн чувствует себя пoлным идиoтoм. Приятнoсть этих мoментoв в пoстижении истины.
Re[2]: Жизнь - это очень узкий мост
От: vnp  
Дата: 27.10.08 06:45
Оценка:
Здравствуйте, Cider, Вы писали:

C>Здравствуйте, sugarde, Вы писали:


S>>1. Четыре человека разных лет подошли ночью с лампочкой к мосту.

S>>Мост узкий, т.е. пройти по нему могут не более двух человек с лампой.

C>Опять гора Фудзи


Ага.

ha-кол ha-олам куло гешер зар м'од
ве ha-икар ло ливташед к'лал
Re[5]: Жизнь - это очень узкий мост
От: ghost92  
Дата: 27.10.08 07:49
Оценка:
Здравствуйте, Кодт, Вы писали:

Интуитивно это понятно, а вот как доказать?
Вообще не понятно может быть иногда выгодно вернуться нескольким шустрикам обратно.
Но похоже жадный алгоритм будет не хуже.
Предлагаю рассмотреть 2 частных случая.
1) 2 мегашустрика со скоростью 0 (ну если необходимо >0, то можно сделать скорость 1/(4N) этого точно хватит на то чтоб покрыть все лишние проходы)
жадный алгоритм доказывается тривиально.
2) 1 мегашустрик со скоростью 0.
тут надо думать.
3) общий случай.
вычитаем из каждого времени прохода время первого.
говорим что проходов по мосту как минимум 2*N — 1. (в жадном алгоритме ровно столько)
мы свели задачу ко 2ому пункту.




К>Здравствуйте, ghost92, Вы писали:


G>>А как разбивать на пары???

G>>Может быть более грамотное разбиение(чем банальные пары соседей в отсортированном массиве) приведет к другому выбору.
G>>Вообще 2ой случай t1 + t3 можно рассмотреть как отдельный перевод 2 независимых тихоней самым шустрым чуваком.
G>>И после этого может быть снова стоит задуматься о новом разбиении на пары.

К>Маленькая эврика. Динамическое программирование и линейная сложность.


К>Сперва примем лемму, что общее направление работ — всё-таки в порядке убывания, а не вперемешку.

К>Действительно, если есть операция "туда t[N-k], t[N]", то предпочтительнее выбрать k=1 — это приведёт как минимум к не худшему состоянию.
К>Но сейчас я её доказывать не буду, чтоб не закопаться.

К>Итак.

К>Имеем операции:
К>- одноходовку "туда t[1],t[N]; обратно t[1]"
К>- двухходовку "туда t[1],t[2]; обратно t[1]" + "туда t[N-1],t[N]; обратно t[2]"
К>- завершающий ход "туда t[1],t[2]" либо "туда t[1],t[3]"
К>Обозначим их кодами 'mov', 'push'+'pop', 'ret0', 'ret1'.

К>Программа действий — это строка из команд, вот в такой автоматной грамматике

К>
К>outside, 'mov'  -> outside
К>outside, 'push' -> inside
К>inside,  'mov'  -> inside
К>inside,  'pop'  -> outside
К>outside, 'ret0' -> finish
К>inside,  'ret1' -> finish
К>


К>Применяя программу к нашему набору t[N],t[N-1],..., в момент, когда на левом берегу остались t[K] и младше, наша программа

К>- потратила какое-то суммарное время
К>- находится в одном из двух состояний: либо "вне двухходовки", либо "внутри двухходовки".

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

К>Дальнейшее очевидно
К>Держим вектор наилучших результатов для текущего K и из него получаем вектор наилучших результатов для K-1.
К>Начинаем с вектора для N (outside -> T=0,P=''; inside -> T=+oo,P='')
К>Приходим к вектору для 2 (outside,inside)
К>И из него приходим к точке (1,finish)

К>

К>Поскольку двухходовки делать вложенными (на нулевом уровне бегают t[1],t[2]; на первом — t[1],t[3]; и т.д.)
К>то автомат у нас уже получается стековый, а число состояний — до N-2.

К>А это уже квадратичная сложность.

К>Но всяко не экспонента.
Re: Оффтопик
От: antirest  
Дата: 28.10.08 16:28
Оценка:
Здравствуйте, sugarde, Вы писали:

S>1. Четыре человека разных лет подошли ночью с лампочкой к мосту.

S>Мост узкий, т.е. пройти по нему могут не более двух человек с лампой.

S>На прохождение моста каждому из путешественников нужно соотв. 1, 2, 5 и 10 мин. Пара двигается со скоростью более медленного.

S>Как пересечь мост по-быстрее?

Один из вариантов ответов:

http://thedailywtf.com/Articles/Classic-WTF-Job-Interview-20-Now-With-Riddles!.aspx
Re[3]: Жизнь - это очень узкий мост
От: sugarde  
Дата: 28.10.08 16:55
Оценка:
Здравствуйте, vnp, Вы писали:

vnp>ha-кол ha-олам куло гешер зар м'од

vnp>ве ha-икар ло ливташед к'лал

Я прочел Ваше сообщение три раза, и мой хомячок сломал клетку, отрастил кожистые крылья и сейчас демонически попискивая носится вокруг люстры. Это нормально?
В жизни кaждoгo челoвекa бывaют приятные мoменты, кoгдa oн чувствует себя пoлным идиoтoм. Приятнoсть этих мoментoв в пoстижении истины.
Re[6]: Жизнь - это очень узкий мост
От: sugarde  
Дата: 28.10.08 16:59
Оценка:
Здравствуйте, ghost92, Вы писали:

G>Предлагаю рассмотреть 2 частных случая.

G>1) 2 мегашустрика со скоростью 0 (ну если необходимо >0, то можно сделать скорость 1/(4N) этого точно хватит на то чтоб покрыть все лишние проходы)
G> жадный алгоритм доказывается тривиально.
G>2) 1 мегашустрик со скоростью 0.
G> тут надо думать.
Угу. Возникают невозможные переходы. Типа, мегашустрик один сбегал на другой берег лампу принес.
В случае с конечным мегашустриком в таких переходах нет смысла.

G>3) общий случай.

G> вычитаем из каждого времени прохода время первого.
G> говорим что проходов по мосту как минимум 2*N — 1. (в жадном алгоритме ровно столько)
G> мы свели задачу ко 2ому пункту.

Кажется, не свели. 1-й не обязан участвовать в каждом переходе.
В жизни кaждoгo челoвекa бывaют приятные мoменты, кoгдa oн чувствует себя пoлным идиoтoм. Приятнoсть этих мoментoв в пoстижении истины.
Re[5]: Жизнь - это очень узкий мост
От: Кодт Россия  
Дата: 29.10.08 11:11
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Поскольку двухходовки делать вложенными (на нулевом уровне бегают t[1],t[2]; на первом — t[1],t[3]; и т.д.)

К>то автомат у нас уже получается стековый, а число состояний — до N-2.

А вот это уже лишнее.
Действительно,

1,2-> 1<- 1,3-> 1<- Y,Z-> 3<- W,X-> 2<-
можно переставить
1,2-> 1<- Y,Z-> 2<- 1,2-> 1<- W,X-> 2<-
и это будет дешевле.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[7]: Жизнь - это очень узкий мост
От: ghost92  
Дата: 29.10.08 16:10
Оценка:
Здравствуйте, sugarde, Вы писали:

S>Здравствуйте, ghost92, Вы писали:


G>>Предлагаю рассмотреть 2 частных случая.

G>>1) 2 мегашустрика со скоростью 0 (ну если необходимо >0, то можно сделать скорость 1/(4N) этого точно хватит на то чтоб покрыть все лишние проходы)
G>> жадный алгоритм доказывается тривиально.
G>>2) 1 мегашустрик со скоростью 0.
G>> тут надо думать.
S>Угу. Возникают невозможные переходы. Типа, мегашустрик один сбегал на другой берег лампу принес.
S>В случае с конечным мегашустриком в таких переходах нет смысла.
Данный переход и правда невозможен. без лампы за лампой не побежишь
А вообще почему бы ему не побегать туда-сюда несколько раз? Может так быстрее будет.

G>>3) общий случай.

G>> вычитаем из каждого времени прохода время первого.
G>> говорим что проходов по мосту как минимум 2*N — 1. (в жадном алгоритме ровно столько)
G>> мы свели задачу ко 2ому пункту.

S>Кажется, не свели. 1-й не обязан участвовать в каждом переходе.

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

Общая идея упрощения в том что показать что жадный алгоритм в данных условиях минимален. При таких условиях проще делать какие-либо утверждения а так же модифицировать алгоритм перевода всех на другой берег.
Re: Жизнь - это очень узкий мост
От: NotImplemented США github.com/NotImplemented
Дата: 05.11.08 18:11
Оценка:
>Здравствуйте, sugarde, Вы писали:

BridgeCrossing
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.