У меня есть сайт, где пользователи задают вопросы (ноль, один или несколько в день), голосуют за них и отвечают на один вопрос в день (подробнее здесь). Пользователь может увидеть вопрос только один раз, либо подав его, либо проголосовав, либо ответив на него.
У меня есть пул вопросов, которые игроки уже видели. Мне нужно удалять 30 вопросов из пула каждый месяц. Мне нужно выбрать вопросы для удаления таким образом, чтобы максимизировать количество доступных вопросов, оставшихся в пуле для игрока с наименьшим количеством доступных вопросов.
Пример с пулом из 5 вопросов (и нужно удалить 3):
Я подумал об удалении вопросов, которые видел лучший игрок, но положение изменится. Следуя приведенному выше примеру, игроку А осталось сыграть только 2 вопроса (2 и 4). Однако, если я уберу 1, 3 и 5, ситуация будет следующей:
Оценка за это решение равна нулю, т.е. игрок с наименьшим количеством доступных вопросов имеет ноль доступных вопросов для игры.
В этом случае лучше удалить 1, 3 и 4, получив:
Оценка за это решение равна единице, так как у двух игроков с наименьшим количеством доступных вопросов для игры есть по одному доступному вопросу.
Если бы размер данных был небольшим, я бы смог найти решение методом грубой силы. Однако у меня сотни игроков и вопросов, поэтому я ищу какой-нибудь алгоритм для решения этой задачи.