76

Re: Один мудрец...

Чтобы найти такой этаж, достаточно одного шарика.  Просто перебираем все этажи подряд, начиная с первого.  Других вариантов нет.

Имея два шарика, появляется пространство для манёвра. wink

Re: Один мудрец...

Просто перебираем все этажи подряд, начиная с первого.

чеееерт... Блин, как я протупил... чето я начал думать фиг знает о чем. smile

От так тобi запорiжцi виcказали, плюгавче.

Re: Один мудрец...

надо с боксом завязыать...

От так тобi запорiжцi виcказали, плюгавче.

79

Re: Один мудрец...

Чтобы найти такой этаж, достаточно одного шарика.  Просто перебираем все этажи подряд, начиная с первого.  Других вариантов нет.

Вопрос не в том, сколько шариков достаточно. И так понятно что и одно хватит. Вопрос в том, как найти нужный этаж на наименьшее кол-во бросков. Т.е. если допустим искомый этаж 100-й, кидаем с первого не разбился, со второго не разбился с 100-го разбился. Ответ найден, было совершено 100 бросков. Это наихудший случай. В лучшем случае (если шарик разбился уже на первом этаже) кол-во шагов один (второй шарик незачем кидать еще раз с первого этажа).

Теперь у нас два шарика, нас интересует наихудший случай и алгоритм с минимальным кол-вом шагов (бросков). Есть по меньшей мере два алгоритма с годаздо меньшим числом шагов.

Отредактировано Ktulkhu (2008-04-09 18:42:08)

80

Re: Один мудрец...

Ktulkhu пишет:

Теперь у нас два шарика, нас интересует наихудший случай и алгоритм с минимальным кол-вом шагов (бросков). Есть по меньшей мере два алгоритма с годаздо меньшим числом шагов.

Ну тогда самый простой, делаем шаг через один этаж. В случае если кидаем и первый шарик разбился на N этаже, то кидаем второй с N-1 если и там разбился то значит N-2 есть наш искомый этаж.

В худшем результате будет 51 шаг.

"Есть в демократии что-то такое,
до чего неприятно касаться рукою."
----------------------------------------------------------------------------------------------------------------
"Когда в обществе нет цветовой дифференциации штанов — то нет цели! А когда нет цели…"

81

Re: Один мудрец...

Или вот ещё. Делаем шаг в 10 этажей. При разбивание первого шарика последние десять этажей проходим поэтажно.
И того в худшем варианте 20 шагов.

"Есть в демократии что-то такое,
до чего неприятно касаться рукою."
----------------------------------------------------------------------------------------------------------------
"Когда в обществе нет цветовой дифференциации штанов — то нет цели! А когда нет цели…"

82

Re: Один мудрец...

brain

ли вот ещё. Делаем шаг в 10 этажей. При разбивание первого шарика последние десять этажей проходим поэтажно.
И того в худшем варианте 20 шагов.

Вообще то 19 шагов (кидать ещё раз второй шар с 100-го этажа незачем). Алгоритм неплохой, но он не самый оптимальный, есть ещё кароче wink

Отредактировано Ktulkhu (2008-04-10 17:04:27)

83

Re: Один мудрец...

Ktulkhu пишет:

Вообще то 19 шагов (кидать ещё раз второй шар с 100-го этажа незачем). Алгоритм неплохой, но он не самый оптимальный, есть ещё кароче wink

К стати я не совсем понял задачу. Два шарика и только два? В случае разбивания новый не выдается?

"Есть в демократии что-то такое,
до чего неприятно касаться рукою."
----------------------------------------------------------------------------------------------------------------
"Когда в обществе нет цветовой дифференциации штанов — то нет цели! А когда нет цели…"

84

Re: Один мудрец...

brain

К стати я не совсем понял задачу. Два шарика и только два? В случае разбивания новый не выдается?

Именно так, всего два шарика. Иначе самым оптимальным алгоритмом был бы банальный бинарный поиск wink

85

Re: Один мудрец...

Наткнулся на форум, хочу поучаствовать. Улучшаю результат brain'а до 18 бросков.
Для решения задачи с стеклянными шариками нужен какой-то математический подход, пока неясно какой.
Но предложение по решению всеже приведу. Наткнулся на него случайно подбирая слагаемые.
Основная идея в том чтобы не использовать постоянный шаг приращения этажа при первом проходе. В предложенной версии шаг был 10, при втором проходе 1. от единицы не уйти, иначе задачу не решить, а вот первый проход можно оптимизировать. Я использовал циклическое изменение шага равным +10, +11, +10, +11... и.т.д. до 100. Таким образом получается ряд:
10, 21, 31, 42, 52, 63, 73, 84, 94, 100
предположим что шарик должен разбиться только с 99 этажа.
проверяем: если представить что шарик не разбивается после 9 броска (94), то остается совершить еще 5 бросков (можно бросить еще раз, для проверки 100 этажа, ведь у задачи может быть решение "шарик вообще не разбивается", это не принципиально) итого 15 бросков всего. Но это не худший случай.
худший случай если шарик должен разбиться на 93 этаже.
в этом случае получается 9 + (93-84) = 18 шагов.
Если он должне разбиться на 83 этаже тоже 18 шагов, дальше по убывающей.
Проверял другие варианты с разными шагами и количеством слагаемых цикла - пока не вышло.
Одно известно точно, 18 далеко не предел wink

86

Re: Один мудрец...

Если бы шаг был фиксированным, то действительно оптимальный шаг будет равен 10. Считать довольно просто, особенно составив электронную таблицу.
Однако, не стоит зацикливаться на фиксированном шаге, так как шаг не всегда оптимальный 10. К примеру, если у вас впереди еще 100 этажей, то возможно, оптимальный шаг будет 10. Но если та же задача была бы озвучена для 30-этажного здания, то мы бы выбрали другой шаг. А почему? Потому что условия задачи другие. Но ведь и в нашем случае, если мы находимся уже на 70 этаже и шарики по-прежнему целы, то остается 30 этажей, а их проверять шагом 10 не выгодно. Использовав другой шаг, можно сэкономить еще парочку итераций.

В случае с 100 этажным зданием, проверять лучше так:
0) Надо прибавить 14 этажей.
1) 14 этаж. Если разбился, то сканируем вторым шариком с 1 по 13 этаж и находим нужный в худшем случае на 14 ход; Иначе прибавляем 13 этажей
2) 27 этаж. Если разбился, то сканируем вторым шариком с 15 по 26 этаж и находим нужный в худшем случае за 14 ходов; Иначе прибавляем 12 этажей
.......
39    11
50    10
60    9
69    8
77    7
84    6
90    5

10) 95    этаж. Если разбился, то проверяем 91, 92, 93, 94 этаж и в худшем случае находим нужный этаж на 14 ход.  Иначе прибавляем 5 этажей и попадаем на 99 этаж.
11) 99 этаж. Разбился, тогда 96, 97, 98 и все так же находим на 14 ход в худшем случае.

Вот, вроде не накосячил нигде. К сожалению, результат получил эмпирическим путем. Общую формулу родить увы не смог, подозреваю что тут участие принимают какие-нибудь логарифмы или пределы, или еще что, а у меня по высшей математике с прошлого года долг sad

В любом случае этот алгоритм позволяет найти этаж за 14 ходов.

Re: Один мудрец...

Крут... Надо наверно Кнута почитать... Все время находится что-то другое что надо читать в данный момент ... sad

Отредактировано Дикий Билл (2008-04-11 11:38:27)

От так тобi запорiжцi виcказали, плюгавче.

88

Re: Один мудрец...

Принял идею Данилка за эталон. Согласен. Оптимизировал. результат 14. не улучшен, но есть система
необходимо уменьшать шаг приращения этажа с каждой итеррацией.
оптимальный шаг для заданного количества этажей принимаю за sqrt(количество этажей)

рассчитываю так:
для каждого приращения этажа, рассчитываю остаток. А сколько еще осталось подниматься? (О - остаток)

О = 100 - Пп;
,где Пп - позиция предыдущая

затем корень квадратный из Остатка (Ко - корень остатка)
Ко = sqrt(О);

затем вычисляю текущую позицию (Пт - позиция текущая)
Пт = Пп + ОКРУГЛ_ДО_ЦЕЛОГО ( Ко + ( Ко*0,6 ) / 2)

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

0,6 коэффицент подобранный вручную. цель сделать первый шаг меньше 14, чтобы улучшить предыдущий результат wink
при уменьшении коэффициента, решение задачи ухудшается.

в результате получаем таблицу

№   текущая остаток  корень(ост.)      шаг(округ)
        0    100         10                13
1    13    87         9,327379053    13
2    26    74         8,602325267    12
3    38    62         7,874007874    11
4    49    51         7,141428429    10
5    59    41         6,403124237    9
6    68    32         5,656854249    8
7    76    24         4,898979486    7
8    83    17         4,123105626    6
9    89    11         3,31662479     5
10    94    6         2,449489743    4
11    98    2         1,414213562    2

если перекосило таблицу, извиняйте. с ней просто наглядней.

самое интересное дальше. если убрать функцию ОКРУГЛ_ДО_ЦЕЛОГО, чего нельзя делать для расчета шагов, но можно для проверки решения, мы получаем ровно 14 шагов, прежде чем Пт станет равным 100!
похоже оптимально.

кто ничего не понял, но жаждит разобраться могу выслать xls файл с расчетом

89

Re: Один мудрец...

забыл добавить. в этом случае шаг убывает нелинейно, это видно в таблице.
можно сделать как-то иначе. если не привязываться к квадратному корню. ну тут без пол-Кнута не разобраться )

90

Re: Один мудрец...

Кажется у меня новая идея.
Почему алгоритм, в котором 14 шагов, оказался оптимальным? Не оттого ли, что в худшем случае, количество бросков первого шарика + количество бросков второго шарика всегда оказывается равным 14. Почему именно 14?
Ради интереса: 100/14=7 (с округлением)
Чем замечательно число 7 в данном случае? Не тем ли, что 7+7=14?
Теперь формула такова: необходимо делить 100 на 1,2,3,4 до тех пор, пока делитель при умножении на 2 не совпадет с результатом деления.

К примеру, в здании 50 этажей:
50/1=50; 1*2-50<>0
50/2=25; 2*2-25<>0
50/3=17 (округ); 3*2-17<>0
50/4=13 (округ); 4*2-13<>0
50/5=10; 5*2-10=0
Итак, для 50 этажного здания нашли, что начинать надо с 10 этажа и в худшем случае мы будем находить результат за 10 попыток.

Private Sub UserForm_Click()
Dim EtKol As Integer  'Количество этажей
Dim SharKol As Integer 'Количество шариков
EtKol = CInt(txtEt) 'Из текстового поля получаем количество этажей
SharKol = 2 'Количество шаров пока 2
Dim x As Integer 'Первый шаг будет в этой переменной

For i = 1 To EtKol
If Round(EtKol / i - i * SharKol, 0) = 0 Then x = Round(EtKol / i, 0)
Next
MsgBox (x)

End Sub

Это код программы, которую я написал на VBA. Я предполагаю, что 2 - это как раз количество шариков. Если их количество взять 3, то для 100 этажного здания не получится при переборе получить 0, но зато получится просто ближайшее к 0 значение. Мне просто лень совершенствовать программу, но думаю все и так ясно.
Проверяйте :blush:

91

Re: Один мудрец...

Ну что я могу сказать - молодцы! smile Несколько слов по поводу оптимальности алгоритма:

Мы заметили, что если бросать с промежутком в 10, то если шарик разобьётся сразу, то вторым шариком мы сможем обнаружить нужный этаж гораздо раньше. Т.е., мы могли бы бросать сразу не с 10го этажа, а выше, и в итоге быстрее добрались бы до верха. Допустим, что мы решили бросать с N-го этажа. Тогда, очевидно, что если первый шарик разобьётся сразу, то нам понадобится еще max N-1 шагов, чтобы узнать нужный этаж. Т.е., в случае, если шарик разбивается сразу, нам нужно всего 1+N-1=N бросков. Ну, а что будет, если шарик сразу не разобьётся?

Первым броском мы отсекли N этажей. Т.е., мы можем перейти к той же задаче, что и раньше, только этажей стало меньше. На каком же этаже нужно бросить шарик еще раз? Очевидно, что на N-1(считая от отсечения). Действительно, если шарик разобьётся получим: 1(первый неудачный бросок)+1(бросок на N+N-1 этаже)+N-2(бросаний второго шарика) - количество бросаний, нужное для определения этажа, если шарик разобьётся в первую или во вторую попытку.

Продолжаем заниматься отсечением. Размеры отсечений у нас получаются N,N-1,N-2 и т.д. Логично, что отсечения когда-то должны закончится. Значит, случится, что сумма всех отсечений будет больше высоты здания. Т.е. N+N-1+N-2. По известной ф-ле суммы арифметической прогрессии, это будет равно N*(N+1)/2. Для того, чтобы сумма отсечений покрывала весь дом, достаточно N=14(а N=13 недостаточно).

92

Re: Один мудрец...

Хм... меня тут немного припозорили по поводу цикла в моей программе.
Конечно, цикл там видимо можно заменить формулой  sqrt(этаж / 2)
Например, sqrt(100/2)=7 (округлено)
Конечно же, x=2*sqrt(100/2)=14 (округленно).
Спасибо Zerkms за тычок носом. Хотя, мой алгоритм выше - это просто поиск нужного русла.
Судя по всему, x=2*sqrt(100/2) как раз и есть искомая формула, где x - этаж, с которого надо начинать

93

Re: Один мудрец...

прошел я http://www.webpark.ru/test/iq/index.php
"Вы ответили на 16 из 18 вопросов, психологи Вам говорят, что Ваши способности просто потрясающие, Вы вполне можете замещать высшее руководство компании, и платить Вам должны не меньше 50 000 рублей."

Немногие знают, что при помощи загибания пальцев можно досчитать вовсе не до 10, а до 1023

94

Re: Один мудрец...

Вот вам новая задачка smile

Есть N коробок. Все они открыты.
Человек проходит и закрывает каждую вторую коробку.
Затем проходит по каждой третей коробки, если она открыта закрывает, если закрыта открывает.
Потом по каждой четвёртой и так до N.
Сколько коробок останутся открытыми после всех этих действий?

"Есть в демократии что-то такое,
до чего неприятно касаться рукою."
----------------------------------------------------------------------------------------------------------------
"Когда в обществе нет цветовой дифференциации штанов — то нет цели! А когда нет цели…"

95

Re: Один мудрец...

1.

Любите систему, и она ответит взаимностью;)

96

Re: Один мудрец...

wyldrodney пишет:

1.

если она открыта закрывает, если закрыта открывает.

"Есть в демократии что-то такое,
до чего неприятно касаться рукою."
----------------------------------------------------------------------------------------------------------------
"Когда в обществе нет цветовой дифференциации штанов — то нет цели! А когда нет цели…"

97

Re: Один мудрец...

сказал бы сразу - что задача давалась на собеседовании в гугл, народ бы начал относиться к условиям серьёзнее :-)

Добавлено Птн 03 Окт 2008 08:12:07 :
ps: как-то странно форум моего юзерагента определяет :-)))))))))))))))))))))))))))))
вот что в заголовках:
User-Agent    Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.17) Gecko/20080926 Firefox/2.0.0.17

а что в результате - сами посмотрите %)

98

Re: Один мудрец...

zerkms

сказал бы сразу - что задача давалась на собеседовании в гугл, народ бы начал относиться к условиям серьёзнее :-)

А мне вот интересно, они серьёзно рассчитывают на то, что найдётся хотя бы пара человек, которые вот так на ходу в уме решат такую задачу. Она в принципе не такая уж и сложная конечно, но немного времени, бумага и ручка не помешают.

99

Re: Один мудрец...

Ktulkhu
эти задачи - поиск нердов. очень хороший и работающий способ :-)

ps: считаю, что в принципе в уме решить реально, если хорошая математическая база