Пролог
Существует классическая задача:
Каждый гость на встрече обменивается рукопожатием с другим. Всего было 78 рукопожатий. Сколько гостей пришло на встречу?
Эта задача представляет интерес только лишь потому, что её нынче задают при трудоустройстве на работу. Поэтому надо уметь её решить и главное доходчиво объяснить решение.
Определения
Для начала микро ликбез.
Граф - множество вершин и рёбер (палочки и кружочки).
Неориентированный граф — это граф, рёбра которого не имеют направления. Это значит, что соединение между двумя вершинами можно пройти в обе стороны. Проще говоря палочки без стрелок.
Две вершины неориентированного графа смежны, если они являются разными концами одного ребра
полный граф - простой неориентированный граф, в котором каждая пара различных вершин смежна.

Сочетание - неупорядоченная выборка из n элементов по k без повторений. Вычисляется по кнопке калькулятора nCr.
Это всё, что надо для решения этой задачи.
Решение
Это задача из раздела дискретной математики, комбинаторики и алгебры.
Если людей принять за вершины графа, а рукопожатия за ребра графа, то сформируется так называемый полный граф. Как математически связаны количество ребер и количеcтво вершин?
Занумеруем всех гостей натуральными числами (1; 2; 3; 4; 5 и т д). Для одного рукопожатия надо выбрать два гостя. Рукопожатие это неупорядоченная (если Уолли жмет руку Ашоку, то и Ашок жмет руку Уолли) выборка без повторений (Тэд же не может пожать руку сам себе).

Согласно формуле nСm надо посчитать
Вот и получается, что у полного графа есть свойство. Если n- это количество вершин, то

(3) это количество рёбер. Задача сводится к тому, что надо решить уравнение (4)
Это уравнение вырождается в квадратное уравнение
Так как ответ мы ищем в множестве натуральных чисел, то выбираем решение 13. Ответ: на встрече пришло 13 человек.

Итог
Вот теперь и Вы умеете решать задачу про рукопожатия и можете объяснить другим.
Ссылки
# |
Название |
URL |
1 |
Полный Граф |
|
3 |
Рукопожатия |
https://tproger.ru/articles/7-zakovyristyh-logiko-matematicheskih-zadach |
2 |
||
4 |
Калькулятор квадратных уравнений |
|
5 |
Задача про мышей и отраву (спрашивали на собеседовании) |
|
6 |
Задача про игральные кубики и треугольники (спрашивали на собеседовании) |
|
7 |
Задача про две ёмкости для жидкости (спрашивали на собеседовании) |
Комментарии (38)
Racheengel
21.05.2025 19:47Классика же, корень из 78×2... и без графов имеем 13...
Leather_bag
21.05.2025 19:47Классика не пляшет как-то. Если одно рукопожатие, то челов выходит корень(2).
mlnw
21.05.2025 19:47Не совсем. Берем формулу арифметической прогрессии (или выводим её в две строчки, если забыли):
И тут уже можно не решать квадратное уравнение, просто берем ближайший больший квадрат целого числа (169). Автор же какойто хрени наворотил.
randomsimplenumber
21.05.2025 19:47И тут уже можно не решать квадратное уравнение, просто берем ближайший больший квадрат целого числа
А зачем вам квадрат целого числа, если задача свелась таки к уравнению?
mlnw
21.05.2025 19:47А зачем вам квадрат целого числа, если задача свелась таки к уравнению?
Чтобы не сводить задачу к решению этого уравнения. Вместо задачки для 7го класса, получаем решение для 5го.
randomsimplenumber
21.05.2025 19:47Но мы же взрослые, что было в 5 классе - забыли на 2 года раньше чем то что было в 7 ;)
Politura
21.05.2025 19:47Что-то из вашего объяснения нифига не понятно как вы пришли к своим формулам. Можно же проще. Так и алгоритм подобрать проще:
Сначала пришел один человек, руку жать не кому, значит итого после его прихода общее количество рукопожатий = 0.
Пришел второй, до него был один человек, он жмет ему руку, общее количество рукопожатий = 0 + 1 = 1
Пришел третий, в группе два человека, которые уже пожали друг другу руки. Он жмет им, итого, общее количество рукопожатий стало: 1 + 2 = 3
Пришел четвертый, в группе 3 человека, которые пожали руки друг другу, опять надо всего-лишь добавить к общему количеству столько, сколько этот новый человек пожмет руки. или 3 + 3 = 6.
6 + 4 = 10
10 + 5 = 15
и тд
То есть решение - простейший цикл, где на каждой итерации к общему количеству прибавляется количество людей из прошлой итерации, и так, пока общее количество не сравняется искомому значению. Такой вариант размышлений приходит сразу в голову, как и простейшая реализация алгоритма. И кодится за 10 минут. А вот ваш вариант, это надо прямо во время стресса на собеседовании суметь вспомнить все эти формулы, да еще потом вспомнить школьную математику, как решаются квадратные уравнения, находится дискриминант и тд. По-моему это не реально на практике.
omaxx
21.05.2025 19:47Т.е. если вас на собеседовании спросят, допустим, сколько нужно линков чтобы соединить 100 компьютеров друг с другом, вместо того, чтобы просто умножить 50 на 99, вы будете суммировать в столбик? Или вам понадобится 10 минут, чтобы "накодить" и компьютер, чтобы посчитать?
Politura
21.05.2025 19:47Не знаю как для других, а для меня интервью это стресс, во время которого я никакие формулы не могу вспомнить. И мне гораздо легче разобрать как меняются данные с каждой итерацией, а уже потом зная это предложить решение и упомянуть, что можно попробовать найти формулу и посчитать одним действием.
Ну а на вопрос на счет линков я предложу использовать свитчи с 24 портами (не знаю, больше бывают, или нет) Ну и соответственно, 100 линков до первых 6-и свитчей и еще 5 свитчей воткнуть в 6-й свитч. Итого 105 линков, а никак не 50 умножить на 99.
omaxx
21.05.2025 19:47А кто вам сказал, что с вопросе речь идет про коммутируемый ethernet? Там сказано "соединить друг с другом"...
Wesha
21.05.2025 19:47я никакие формулы не могу вспомнить.
Как нас учили в универе, «не можешь вспомнить — выведи!»
Wesha
21.05.2025 19:47И всё это называется страшным словом ИНДУКЦИЯ!
dzhiharev
21.05.2025 19:47Все это называется "арифметическая прогрессия", а формулу суммы первых N ее членов проходят где-то в 9 классе.
Wesha
21.05.2025 19:47Нет, я про метод, говоря простым языком, «начнём с одного, потом добавим ещё одного, потом ещё одного... повторять до опупения».
dzhiharev
21.05.2025 19:47При индукции нужно не до опупения повторять, а до выведения закона, который еще нужно доказать (например методом математической индукции). В нашем случае законом как раз будет формула суммы первых N членов арифметической прогрессии. В изначальном комментарии предлагалось просто в цикле добавлять, пока ответ не получится, а не вывести формулу - это не индукция, а алгоритм.
VitaminND
21.05.2025 19:47Сколько нынче Бизнес платит за решение подобных задач в процессе трудовой деятельности?
Или Бизнес все-таки платит не за такие задачи?
aabzel Автор
21.05.2025 19:47"Сколько нынче Бизнес платит за решение подобных задач в процессе трудовой деятельности?"
На роли программиста микроконтроллеров у меня за 12 лет не возникало таких вот задач.
Сам не понимаю зачем спрашивать такое на собеседовании.Речь шла о ЗП 160к RUR /мес gross.
pnmv
21.05.2025 19:47(специально, не пошел читать комментарии)
Каждый гость на встрече обменивается рукопожатием с другим. Всего было 78 рукопожатий. Сколько гостей пришло на встречу?
что означает "с другим"?
с одним из соседей?
только с одним? (тогда, по кругу, и будет 78)
а на картинках графы, как будто каждый с каждым. зачем?
если каждый гость обменивается рукопожатиями со всеми остальными, что соответствует графам с картинок, то, если у нас n гостей, то каждый совершает n-1 рукопожатий (неуместно жать руку самому себе), а все вместе n*n-n, тогда получаем уравнение n^2-n-78=0. получается, слегка дробное число гостей.
вот, если бы их было 72...
AuToMaton
21.05.2025 19:47Мне кажется, собеседование о другом, никого не интересует, точнее - не должно интересовать, умеет ли кандидат считать. Такую ерунду как
Каждый гость на встрече обменивается рукопожатием с другим. Всего было 78 рукопожатий. Сколько гостей пришло на встречу?
спрашивают чтобы получить откровенный ответ. Типа
Пришло 79 гостей если Другой тоже гость, и 78 если Другой - хозяин.
Поскольку при обмене сущности не уничтожаются и не появляются, то 78 или 39 или 26 или 13 или 6 или 2 или 3 в зависимости от того, по сколько рукопожатий было у каждого гостя.
… (молчит и считает) … (сморкается, вытирает слёзы) … да, он трижды, трижды …
О, 78 - это же минимальное число рёбер многогранника в 12-мерном пространстве, значит гостей было 13.
Неизвестно - пока одни гости приходили, другие могли не только уходить, но и возвращаться.
А если человек не даёт откровенного ответа… то он скрытен, подозрителен, коварен и хитёр - такой и нужен нам в команду.
CitizenOfDreams
21.05.2025 19:47Я впервые в жизни встретил эту задачу, и секунды за две увидел последовательность 1+2+3+4+...=78. Какие, на фиг, "смежные вершины неориентированных графов"?
randomsimplenumber
21.05.2025 19:47Надо же чего-то спросить на собеседовании. Как насчёт олимпиадной задачи за 6 класс?
Недоумевающие смайлик.тхт
omaxx
21.05.2025 19:47Ну, судя по комментариям, их задают не просто так
randomsimplenumber
21.05.2025 19:47Если это собеседование о приеме на работу, то, наверное, от кандидата ожидается максимально простое решение. Если он притащит додекаэдр в 13-мерном пространстве, он конечно же умный. Но если он код будет писать в таком же стиле - нафиг :)
mlnw
21.05.2025 19:47За такое решение при наличии решения в две строчки на уровне 5 класса школы, гнать в шею надо таких кандидатов. Потом и проекты у таких соответствующие: надо написать простейшую функцию, они вместо трёх строчек кода для этого десяток сторонних либ подключат.
nerudo
21.05.2025 19:47Я уверен, что основная хитрость этой задачи - в умении решить квадратное уравнение. Ибо курсу к пятому этот навык уже выветривается, а доценты с кандидатами и вовсе не помнят этих странных дискриминантов Виета.
ganqqwerty
21.05.2025 19:47А если я дал ответ "каждый гость - вершина графа, каждое рукопожатие - ребро графа, ненаправленное, циклов нет. Количество ребер известно, открывайте справочник, там была формула для количества вершин" - норм?
RavenStark
21.05.2025 19:47Ок... Каждый из гостей (всех гостей) пожал руку другому. То есть, у нас есть неизвестное полное количество, разбитое на неповторяющиеся пары. Таким образом, кмк, задача сводится к вопросу "из какого общего количества элементов можно составить 78 уникальных пар", так?
SystemSoft
может 78 + 78 = 156? просто так намного проще. правда, если там может быть что два гостя одному жали руку... то... не знаю