- 17, Oct 2024
- #1
Введение
Большие встречи тратят рабочее время. Наша цель — разделить большое собрание на несколько более мелких, чтобы среднее количество тем, которые обсуждает человек, было сведено к минимуму, но каждый человек должен присутствовать на каждом собрании, которое ему интересно.
Вход
Дана функция от набора тем \$T\$ к набору людей \$P\$, интересующихся этой темой $$f:T \rightarrow 2^P$$ и максимального размера раздела \$m\ $.
Это кодируется как массив массивов, где элемент \$f(i)\$ содержит темы человека \$i\$.
Тестовый пример
m = 3
f = [
[9,7],
[3,7,6,4],
[3,1,2],
[7,5,4,2],
[6,2,8,1,4],
[3,7,2,9,8],
[4,3,2],
[3,4,6],
[1,9,5,3],
[6,4,1,2],
[9,7,3,1],
[1,7,4],
[5,1,7,2],
[5,2,7],
[4,2,6,9],
[6,4,1],
[6,5,9,8],
[9,1],
[9,1,5,6],
[1,2,4,8,7]
]
Выход
Найдите разбиение \$T\$ (разбиение на непересекающиеся подмножества, покрывающие все множество) на $$X = {T_1, T_2, \ldots, T_n}$$, где \$n\le m\$ , так что минимизируется следующий член:
$$r = \sum_{T' \in X}{(|(\bigcup_{t \in T'} f(t))|\times |T'|)} $$
Чтобы лучше понять \$r\$, если на обсуждение каждой темы уходит час, то \$r\$ — это общее количество человеко-часов, необходимых для проведения собраний.
Если существует несколько размеров разделов с одинаковым \$r\$, \$n\$ также следует минимизировать.
Вывод должен содержать раздел \$X\$ в виде двумерного массива, например:
$$X = [[0,1,2,3],[4,5,6],[7,8,9]] $$
Условие победы
Я ищу самый быстрый алгоритм, который находит абсолютный минимум \$r\$ и \$n\$.