编程介的小学生 2020-09-28 08:51 采纳率: 0.4%
浏览 22

Campus Recruit 校区问题

Problem Description
With the new recruiting season's coming, lots of famous corporations come on campus to recruit new employees.

There are m corporations numbered from 1 to m, each of which has certain available positions for hiring students. The total number of the available positions is P. There are n students numbered from 1 to n. It is guaranteed that P ≤ n. Each corporation has a different preference for each student, which is denoted by an positive integer; the bigger the better. Each student has a different preference for each corporation, which is denoted by an positive integer; the bigger the better. All the preference numbers are not greater than 10,000.

The task, naturally, is to find a way of assigning each student to at most one corporation. In such a way, all available positions in all corporations are filled. Meanwhile we hope the assignment is stable. We say that the assignment is stable if neither of the following situations arises.

First type of instability: There are two students s and s', and a corporation c. The assignment is instable if

  • s is assigned to c, and

  • s' is assigned to no corporation, and

  • c prefers s' to s.

Second type of instability: There are two students s and s', and two corporations c and c'. The assignment is instable if

  • s is assigned to c, and

  • s' is assigned to c', and

  • c prefers s' to s, and

  • s' prefers c to c'.

We would like to find a stable assignment. Can you solve it?

Input
The input contains several cases. The first line of each case contains two integers m (1 ≤ m ≤ 100) and n (1 ≤ n ≤ 1000), indicating the number of corporations and students. This is followed by one line, containing m integers, in which the ith number indicates the number of available positions of ith corporation. This is followed by m lines, each containing n integers, in which the jth element of the ith line indicates the preference of the ith corporation to the jth student. This is followed by n lines, each containing m integers, in which the jth element of the ith line indicates the preference of the ith student to the jth corporation. The input ends with m=0 and n=0.

Output
For each case, output one line, containing n integers separated by exactly one space, in which the ith number indicates the corporation the ith student is assigned to (0 means the ith student is assigned to no corporation). Please output a new blank line after each case. If there are several solutions to one case, you may output any one of them.

Sample Input
2 3
1 1
3 2 1
2 3 1
1 2
2 1
1 2
2 3
1 1
3 2 1
2 3 1
1 2
2 1
1 2
0 0

Sample Output
1 2 0

1 2 0

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-07-25 09:23
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    To solve this problem, we can use the Stable Marriage (Gale-Shapley) algorithm. The algorithm aims to produce a stable matching between two equally sized sets of elements given an ordering of preferences for each element. Here is a step-by-step guide:
    1. Initialize an array to store the current matching status of students to corporations. Initially, all students are not assigned to any corporation.
    2. While there are unassigned students: a. Choose an unassigned student s. b. For student s, find the most preferred corporation c that s has not yet proposed to. c. If the corporation c has available positions, s gets assigned to c. Otherwise, check if s prefers c over its current assignment. If yes, reassign the current student of corporation c to no corporation and assign s to c.
    3. Repeat step 2 until all students are assigned to corporations. Here is a Python code snippet to implement the algorithm:
    def stable_matching(m, n, positions, corp_pref, stud_pref):
        students = [0] * n
        positions = positions.copy()
        while 0 in students:
            s = students.index(0)  # Select the first unassigned student
            for c in stud_pref[s]:
                if positions[c] > 0:
                    students[s] = c
                    positions[c] -= 1
                    break
                else:
                    s_dash = [i for i, val in enumerate(students) if val == c][0]
                    if corp_pref[c][s] > stud_pref[s][c] and stud_pref[s][c] > corp_pref[c][s_dash]:
                        students[s] = c
                        students[s_dash] = 0
                        break
        return students
    # Read input
    results = []
    while True:
        m, n = map(int, input().split())
        if m == 0 and n == 0:
            break
        positions = list(map(int, input().split()))
        corp_pref = [list(map(int, input().split())) for _ in range(m)]
        stud_pref = [list(map(int, input().split())) for _ in range(n)]
        assignment = stable_matching(m, n, positions, corp_pref, stud_pref)
        results.append(assignment)
    # Output results
    for res in results:
        print(" ".join(map(str, res)))
        print()
    

    In the given sample input, the code will produce the following output:

    1 2 0
    1 2 0
    
    评论

报告相同问题?