В мою голову пришла случайная мысль (конечно, когда я делила шоколадку!). Мне было интересно, если есть общий алгоритм для решения этой проблемы.
Проблема выглядит так:
Информация
1. У вас есть шоколадная плитка с маленькими квадратами, расположенными в прямоугольной матрице
2. В комнате n человек
Проблема
Напишите алгоритм, который выводит оптимальную конфигурацию (p x q), в которой планка может быть распределена поровну между n, n-1, n-2...., 2, 1
людьми с учетом следующих ограничений:
1. Маленькие квадраты (единичный квадрат) нельзя разрезать на более мелкие кусочки
2. Все разрывы должны быть сделаны полностью вдоль одной оси
3. Общее количество разрывов не может быть больше n (это препятствует неэффективным решениям, таким как попытка разбить весь стержень на мелкие кусочки и разделить маленькие кусочки)
4. p или q не могут быть равны 1. yx указал в одном из ответов, что проблема легко разрешима, если у одной стороны есть 1 столбец. Это, однако, не является хорошим решением для ситуаций реального мира - целью которых было решение этой проблемы :)
Пример
Для n = 4 оптимальная конфигурация 4 х 3.
~~~~ ~~~~ ~~~~ ~~~~
| | | | |
~~~~ ~~~~ ~~~~ ~~~~
| | | | |
~~~~ ~~~~ ~~~~ ~~~~
| | | | |
~~~~ ~~~~ ~~~~ ~~~~
Эту конфигурацию можно разделить на:
4 человека за 3 перерыва по вертикальной оси
3 человека с 2 перерывами по горизонтальной оси
2 человека с 1 перерывом по центру
Другими эмпирическими решениями являются (n, p, q) = (1, 1, 1); (2, 2, 1); (3, 3, 2); (4, 4, 3); (5, 5, 12); (6, 6, 10) OR (6, 5, 12)
Пояснения
Разрыв определяется как разрез по одной оси для подмножества стержня, если применимо. Чтобы лучше проиллюстрировать это, скажем, у вас есть 2 x 2 плитки шоколада, как это:
~~~~ ~~~~
| | |
~~~~ ~~~~
| | |
~~~~ ~~~~
Обычная мудрость гласит, что вам нужно сделать 2 перерыва (перпендикулярные оси посередине - вниз и поперек), чтобы разделить эту планку на 4 части. Однако в реальном мире (если бы это была плитка шоколада) вы сначала разбили бы ее пополам, а затем снова разбили каждую половину по отдельности. Это дает в общей сложности 3 перерыва - 1 перерыв на весь бар и 2 перерыва на 2 различных подмножества бара.
Я не мог найти решение где-либо в Интернете - если кто-то считает, что это не Вопрос, связанный с программированием, или решение уже существует, не стесняйтесь закрыть вопрос =)