Записи с меткой «задачки»

О пользе наук

18.10.2011

Недавно на собеседовании мне предложили несколько задачек, среди которой была задача о шарах. Вы, возможно, знаете ее, формулировка у ней такая. В корзине лежит m белых и n черных шаров. Из нее наугад вынимают 2 шара. Если шары одного цвета, то в корзину возвращают белый шар, если разного, то черный. Считается, что есть достаточное количество белых шаров вне корзины для их возврата в случае постоянной выемки пар из двух черных шаров. Вопрос: можно ли, зная числа m и n, заранее сказать, какой шар в корзине останется последним?

К своему стыду за отведенное время я эту задачу не решил, хотя провозился с ней долго. Я вообще несколько туповат и тугодум, поэтому быстро решать подобные задачи не могу. На днях я вернулся к этой задачке, так как решить ее было делом чести.

Сначала я снова начал бродить вокруг тех же безрезультатных идей, которые у меня были на собеседовании. Но потом вдруг вспомнил о недавнем чтении ТФКП и придумал вот что. Пусть общее число шаров в корзине соответствует некому комплексному числу z = x + iy, причем действительная часть показывает количество белых шаров, а мнимая — черных. Если вынули два белых шара и затем один вернули, то в корзине останется x + iy-2 + 1 = (x-1) + iy. Если вынули два черных и вернули белый, то в корзине будет x + iy-2i + 1 = (x + 1) + i(y-2). И, наконец, если вынули белый и черный и вернули черный, в корзине останется x + iy-1-i + i = (x-1) + iy. Видно, что третий случай эквивалентен первому. Кроме того, общее число шаров (x + y) на каждом шаге уменьшается ровно на единицу, то есть в конечном итоге действительно останется только один шар. Таким образом, при очередной выемке к текущему числу шаров прибавляют либо число z_1 = -1, либо z_2 = 1-2i.

Пусть до того, как в корзине остался один шар, сделали k выемок по z_1 и l выемок по z_2 (k, l — неотрицательные целые). Тогда возможно два варианта: m + in + kz_1 + lz_2 = 1, если последний шар белый, и m + in + kz_1 + lz_2 = i, если последний шар черный.

Вообще, сами комплексные числа тут особо не нужны, нужно только их представление на комплексной плоскости, т. е. можно вполне обойтись обычными векторами. Пусть (m, n) — вектор, задающий начальное состояние корзины. Тогда конечное состояние можно представить в виде суммы начального вектора и линейной комбинации векторов (-1, 0) и (1, -2).

Таким образом, векторные уравнения распадаются на пары скалярных:

m + (-1)\cdot k + l = 1 \\n + 0\cdot k + (-2)\cdot l = 0, если последний шар белый, и

m + (-1)\cdot k + l = 0 \\n + 0\cdot k + (-2)\cdot l = 1, если последний шар черный.

Отсюда видно, что n = 2l для белого шара и n = 2l + 1 для черного. То есть если начальное число черных шаров четное, то последним останется белый шар, если нечетное — то черный. Это и есть ответ.

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

,

ЭВМ/ Так зачем нам нужен IP?

24.08.2011

Меня иногда приглашают поприсутствовать на собеседованиях на вакансию системного администратора Unix/Linux или чего-то подобного. На этих мероприятиях я люблю задавать один простой вопрос: зачем нам нужен IP протокол, и почему нельзя построить весь Интернет на коммутаторах? В самом деле, Ethernet мало чем отличается от IP. Адреса есть, причем их существенно больше (2^{48} против 2^{32}), доставка сообщений такая же негарантированная. Размер IP пакета больше Ethernet фрейма, но существенной роли это не играет, так как протоколы верхнего уровня все равно нарезают потоки данных на сегменты. Коммутаторы могут обмениваться таблицами коммутации, можно даже придумать схему маршрутизации по первым октетам MAC-адреса. Есть небольшая проблемка, связанная с broadcast штормами в больших Ethernet сегментах, но, мне кажется, она решаема. Так зачем же нам дополнительный уровень?

Аналогичный вопрос: зачем нужен UDP, если уже есть один протокол с негарантированной доставкой — IP?

Я думаю, вы все знаете правильный ответ, хотя от кандидатов я его не слышал. Суть, конечно же, в абстрагировании от технологии передачи. Наличие промежуточного слоя в виде IP позволяет легко связать абсолютно разные сети, скажем, Ethernet и PPP поверх GPRS. Если бы IP протокола не было, мы бы его непременно выдумали, начав делать конвертеры из одной среды передачи в другую.

ЭВМ/ Задачка

10.11.2010

Обсуждали тут с коллегой за утренним кофе такую структуру данных как хеш. В процессе родилась задачка. Пусть есть хеш-таблица на 1000 ключей. В нее занесли n значений (n > 1000). В среднем на каждый ключ будет приходиться по n / 1000 коллизий. Значит, среднее время поиска значения будет O(1) + O(n / 1000) = O(n). Однако всем известно, что время поиска в хеш-таблице константа, т.е. O(1). Вопрос: где ошибка в рассуждениях?

,

Загадка

26.08.2010

Знаете слово с тремя (спасибо читателям за помощь) четырьмя дефисами? Причем вполне обыденное.

Ответ: по-рок-н-ролльному-то плясать умеешь?

Задачка

06.04.2010

Племяннику в школе задали интересную задачку по физике: куда девается потенциальная энергия сжатой цинковой пружины после того, как ее растворили в соляной кислоте?

,