Поместите всех на курс первого выбора, если это возможно.
Если есть кто-то, кто не получил его, поставьте его на второй выбор.
Теперь у нас могут быть те, кто не получил ни одного из своих выборов. («проигравшие».)
Найдите человека, который получил свой первый выбор курса, который также является вторым выбором «неудачника». Этот парень будет переназначен на его второй выбор, в то время как "неудачник" заберет свой слот. Если такого человека нет, то ваша проблема неразрешима.
Обратите внимание, что это максимизирует количество людей, которые получили свой первый выбор:
Если у вас есть второй выбор, то это означает либо:
- кто-то уже получил ваш первый выбор в качестве своего первого выбора
- кто-то другой получил ваш первый выбор как его второй выбор, но только потому, что его первый выбор был выбран как чей-то второй выбор, и чей первый выбор был заполнен студентами первого выбора.
(Возможно, последним битом немного сложно следовать, поэтому вот переписывание:)
Для человека X с первым выбором A и вторым выбором B:
Если X получил выбор B, то:
- Y взял ячейку X в A, а Y выбрал A.
- Y взял слот X в A, и второй выбор Y - A. Первый выбор Y - C, но все слоты C заполнены другими студентами, чей первый выбор также C.