На входе есть массив учеников типа:
[
{id: 1, maxMeetingsPerWeek: 10, meetingsTypes: ["group", "duo"]},
{id: 2, maxMeetingsPerWeek: 3, meetingsTypes: ["duo"]}
{id: 3, maxMeetingsPerWeek: 5, meetingsTypes: ["group"]},
{id: 4, maxMeetingsPerWeek: 5, meetingsTypes: ["group"]},
{id: 5, maxMeetingsPerWeek: 1, meetingsTypes: ["duo", "group"]}
]

ЗАДАЧА: отгруппировать учеников таким образом, чтобы
1) каждая группа имела общий тип встреч (т.е. если ученик хочет встречи только 1 на 1, следует это учитывать)
2) кол-во встреч каждого ученика не превышала maxMeetingsPerWeek
3) число учеников на каждой встрече было разное, но не меньше 1
4) ученики на каждой встрече отличались (чтобы не встречались одни и те же ученики)

На выходе должен быть 2d-массив встреч типа [[user, user], [user, user, user]]
Любой язык программирования. Не обязательно, но желательно использовать графы.
Добавил файл с примером какой результат должен получиться.

Приложения:

Ответы

Ответ дал: andreyfedyanovich
1

def group_students(students):

meetings_dict = {}

for student in students:

for meeting_type in student['meetingsTypes']:

if meeting_type not in meetings_dict:

meetings_dict[meeting_type] = []

meetings_dict[meeting_type].append(student)

Сортируем учеников по убыванию maxMeetingsPerWeek

sorted_students = sorted(students, key=lambda x: x['maxMeetingsPerWeek'], reverse=True)
meetings = []

for student in sorted_students:

added = False

for meeting_type in student['meetingsTypes']:

if meetings_dict.get(meeting_type):

for meeting in meetings_dict[meeting_type]:

if len(meeting) < meeting['maxMeetingsPerWeek']:

meeting.append(student)

added = True

break

if added:

break

if not added:

meetings.append([student])

return meetings

students = [

   {'id': 1, 'maxMeetingsPerWeek': 10, 'meetingsTypes': ['group', 'duo']},

   {'id': 2, 'maxMeetingsPerWeek': 3, 'meetingsTypes': ['duo']},

   {'id': 3, 'maxMeetingsPerWeek': 5, 'meetingsTypes': ['group']},

   {'id': 4, 'maxMeetingsPerWeek': 5, 'meetingsTypes': ['group']},

   {'id': 5, 'maxMeetingsPerWeek': 1, 'meetingsTypes': ['duo', 'group']}

]

result = group_students(students)

print(result)

Вас заинтересует