Эта запись будет интересна в основном программистам.
Красивая задачка, которую подкинули во внутренней рассылке:
Отсортируйте пять чисел, используя не более семи сравнений.
(комментарии оставлю скрытыми до завтра)
Update: уточнение условий: складывать/умножать числа не разрешается. Вообще разрешается только сравнивать их друг с другом, а больше никакой информации о них не дано. "Сравнивать", определенности ради, означает применять операцию "<" или ">", на выбор.
Update: открываю все комментарии. Довольно много правильных ответов, найденных с помощью "перебора" в определенном смысле. В этом нет ничего зазорного (и я тоже так решил), но если вы нашли решение таким способом, могу порекомендовать в качестве дополнительного упражнения - найти способ "объяснить" это уже найденное решение более кратким и понятным образом. Такие "простые" решения в комментах тоже есть, но всего два-три.
Красивая задачка, которую подкинули во внутренней рассылке:
Отсортируйте пять чисел, используя не более семи сравнений.
(комментарии оставлю скрытыми до завтра)
Update: уточнение условий: складывать/умножать числа не разрешается. Вообще разрешается только сравнивать их друг с другом, а больше никакой информации о них не дано. "Сравнивать", определенности ради, означает применять операцию "<" или ">", на выбор.
Update: открываю все комментарии. Довольно много правильных ответов, найденных с помощью "перебора" в определенном смысле. В этом нет ничего зазорного (и я тоже так решил), но если вы нашли решение таким способом, могу порекомендовать в качестве дополнительного упражнения - найти способ "объяснить" это уже найденное решение более кратким и понятным образом. Такие "простые" решения в комментах тоже есть, но всего два-три.
no subject
Date: 2008-07-16 06:23 pm (UTC)no subject
Date: 2008-07-16 06:23 pm (UTC)(no subject)
From:no subject
Date: 2008-07-16 06:46 pm (UTC)Сортируем четыре числа, за три сравнения вставляем между ними пятое.
no subject
Date: 2008-07-16 07:21 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:ой ли?
From:Re: ой ли?
From:Re: ой ли?
From:no subject
Date: 2008-07-16 07:03 pm (UTC)Скажем, процессорная команда cmp позволяет получить больше информации, чем простая операция "<".
no subject
Date: 2008-07-16 07:23 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2008-07-16 07:12 pm (UTC)Пусть есть массив a[5] одного из числовых типов и переменная b того же типа. тогда:
{
if ( a[0] > a[1] )
{
b = a[0];
a[0] = a[1];
a[1] = b;
}
if ( a[2] > a[3] )
{
b = a[2];
a[2] = a[3];
a[3] = b;
}
if ( a[1] > a[3] )
{
b = a[0];
a[0] = a[2];
a[2] = b;
b = a[1];
a[1] = a[3];
a[3] = b;
}
if ( a[1] > a[4] )
{
if ( a[0] > a[4] )
{
if ( a[0] > a[2] )
{
if ( a[4] > a[2] )
{
b = a[0];
a[0] = a[2];
a[2] = b;
b = a[1];
a[1] = a[4];
a[4] = a[3];
a[3] = b;
}
else
{
b = a[0];
a[0] = a[4];
a[4] = a[3];
a[3] = a[1];
a[1] = a[2];
a[2] = b;
}
}
else
{
if ( a[1] >= a[2] )
{
b = a[0];
a[0] = a[4];
a[4] = a[3];
a[3] = a[1];
a[1] = b;
}
else
{
b = a[0];
a[0] = a[4];
a[4] = a[3];
a[3] = a[2];
a[2] = a[1];
a[1] = b;
}
}
}
else
{
if ( a[4] > a[2] )
{
if ( a[0] > a[2] )
{
b = a[0];
a[0] = a[2];
a[2] = a[4];
a[4] = a[3];
a[3] = a[1];
a[1] = b;
}
else
{
b = a[1];
a[1] = a[2];
a[2] = a[4];
a[4] = a[3];
a[3] = b;
}
}
else
{
if ( a[1] >= a[2] )
{
b = a[1];
a[1] = a[4];
a[4] = a[3];
a[3] = b;
}
else
{
b = a[1];
a[1] = a[4];
a[4] = a[3];
a[3] = a[2];
a[2] = b;
}
}
}
}
else
{
if ( a[3] > a[4] )
{
if ( a[1] > a[2] )
{
b = a[3];
a[3] = a[4];
a[4] = b;
if ( a[0] > a[2] )
{
b = a[0];
a[0] = a[2];
a[2] = a[1];
a[1] = b;
}
else
{
b = a[1];
a[1] = a[2];
a[2] = b;
}
}
else
{
if ( a[4] >= a[2] )
{
b = a[3];
a[3] = a[4];
a[4] = b;
}
else
{
b = a[2];
a[2] = a[4];
a[4] = a[3];
a[3] = b;
}
}
}
else
{
if ( a[1] > a[2] )
{
if ( a[0] > a[2] )
{
b = a[0];
a[0] = a[2];
a[2] = a[1];
a[1] = b;
}
else
{
b = a[1];
a[1] = a[2];
a[2] = b;
}
}
}
}
}
Проверить легко, если есть любой компилятор :)
no subject
Date: 2008-07-17 07:37 pm (UTC)Можно еще придумать, как то же описать проще (см. апдейт).
no subject
Date: 2008-07-16 07:21 pm (UTC)(Кстати, я одно время задавал эту задачку на интервью; знание источников также приветствовалось, но, к сожалению, ни один интервьюируемый его не проявил.)
no subject
Date: 2008-07-17 07:38 pm (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2008-07-16 07:38 pm (UTC)числа: а, б, в, г, д
а = о
а + б < в
б + в = г
г < д
no subject
Date: 2008-07-17 07:38 pm (UTC)no subject
Date: 2008-07-16 07:40 pm (UTC)no subject
Date: 2008-07-16 08:31 pm (UTC)no subject
Date: 2008-07-16 07:41 pm (UTC)no subject
Date: 2008-07-16 08:28 pm (UTC)no subject
Date: 2008-07-16 07:42 pm (UTC)no subject
Date: 2008-07-16 08:28 pm (UTC)no subject
Date: 2008-07-16 07:43 pm (UTC)Пять цифр - A, B, C, D, E
1.Если A>B - меняем значения местами (A=B, B=A)
2.Если B>C - меняем значения местами
3.Если C>D - меняем значения местами
4.Если D>E - меняем значения местами
5.Если C>D - меняем значения местами
6.Если B>C - меняем значения местами
7.Если A>B - меняем значения местами
Т.е. пробегаем снизу вверх и обратно. Уверен, что есть и другие способы.
no subject
Date: 2008-07-16 08:29 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2008-07-16 08:30 pm (UTC)no subject
Date: 2008-07-16 08:13 pm (UTC)no subject
Date: 2008-07-16 08:38 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2008-07-16 08:18 pm (UTC)Но задачка интересная, да. Очень спасибо. :)
no subject
Date: 2008-07-17 07:39 pm (UTC)no subject
Date: 2008-07-16 08:22 pm (UTC)А потом я прикинул и понял, что простой merge sort тоже подойдет.
Делишь числа на группу из двух и группу из трех. Сортируешь их по отдельности. (3 числа сортируется за 1 сравнение, 3 числа - за 3). Потом обе группы сливаются в одну. Это еще максимум 3 сравнения. Итого как раз 7.
no subject
Date: 2008-07-16 08:49 pm (UTC)Конкретно если, то последняя часть второго решения несколько кавалеристски описана, и мне не вполне понятно, как это сработает.
(no subject)
From:no subject
Date: 2008-07-16 08:23 pm (UTC)no subject
Date: 2008-07-16 08:31 pm (UTC)no subject
Date: 2008-07-16 08:26 pm (UTC)no subject
Date: 2008-07-17 07:40 pm (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:Это школьная олимпиадная задача про взвешивания
Date: 2008-07-16 08:28 pm (UTC)Re: Это школьная олимпиадная задача про взвешивания
Date: 2008-07-17 07:42 pm (UTC)Re: Это школьная олимпиадная задача про взвешивания
From:no subject
Date: 2008-07-16 08:34 pm (UTC)7 взвешиваний рассекают 2^7 = 128 вариантов
Должны успеть.
Тактика решения подобных задач: каждое рассечение вариантов как можно ровней, чтобы после рассечения множества вариантов не делились на "удачное" и "неудачное". Идеально, если рассечение бьет множество симметрично. Тогда не надо рассматривать различные исходы.
Поехали:
A, B, C, D, E 1. A ? B A < B 2. C ? D A < B C < D 3. B ? D A < B < C < D 4.a. D ? E A < B < C < D E < 5.a. C ? E A < B < C < E < D далее A за два сравнения доставляем в ряд C,E,D,B 4.b. D ? E A < B < C < D < E 5.b. B ? E A < C < D < E < B или A < C < D < B < E в любом случае доставляем A за два сравненияno subject
Date: 2008-07-17 07:44 pm (UTC)(no subject)
From: (Anonymous) - Date: 2008-07-18 12:37 am (UTC) - Expand(no subject)
From:no subject
Date: 2008-07-16 08:42 pm (UTC)Сравниваем M1 и M2 (3ье сравнение). Без ограничения общности можно считать, что M2 больше:
m1 < M1 ^ m2 < M2Сравниваем теперь оставшееся ещё неиспользованным пятое число (x) с M1. Возможны 2 варианта:(1)
m1 < M1 < x ^ m2 < M2(2)x ^ m1 < M1 ^ m2 < M2Легко видеть, что оставшихся трех сравнений достаточно, чтобы сделать эти частичные порядки полными.no subject
Date: 2008-07-17 07:44 pm (UTC)no subject
Date: 2008-07-16 08:50 pm (UTC)no subject
Date: 2008-07-17 07:44 pm (UTC)(no subject)
From:no subject
Date: 2008-07-16 08:53 pm (UTC)A,B - группа1, C, D - группа 2, Е - группа 3
Далее, предположим, что "победитель" группы - который больше. Тогда максимум можно выбрать за 4 сравнения:
А,B -> Win1
-> Win3
C,D -> Win2
-> Win4
E
И вот здесь вопрос: могу ли я проверить, что Win4 "is" Win3?
no subject
Date: 2008-07-17 07:45 pm (UTC)no subject
Date: 2008-07-16 08:53 pm (UTC)no subject
Date: 2008-07-16 09:11 pm (UTC)no subject
Date: 2008-07-16 08:55 pm (UTC)no subject
Date: 2008-07-17 07:45 pm (UTC)no subject
Date: 2008-07-16 09:10 pm (UTC)no subject
Date: 2008-07-16 09:14 pm (UTC)