На входе есть массив учеников типа:
[
{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]]
Любой язык программирования. Не обязательно, но желательно использовать графы.
Добавил файл с примером какой результат должен получиться.
Answers & Comments
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)