此问题来自CodeEval problem 118
您的团队正在搬到新办公室。为了让他们在新的地方感觉舒适,你决定让他们选择他们想要的座位。每个团队成员都会向您提供他/她认为可以接受的席位列表。您的目标是确定是否可以满足使用这些列表的每个人。
新办公室的座位数从1到N.每个团队成员给你的座位偏好列表未分类。
输入和输出示例:
1:[1, 3, 2], 2:[1], 3:[4, 3], 4:[4, 3] --> Yes # possible 1:[1, 3, 2], 2:[1], 3:[1] --> No # not possible
如何解决?
我尝试了什么?我认为解决方案是递归的,这是我到目前为止所提出的,但我认为我没有正确地将问题分解为较小的子问题。
def seat_team(num_seats, preferences, assigned):
if len(preferences) == 1:
for seat in range(len(preferences)):
print preferences
seat_wanted = preferences[0][1][seat]
if not assigned[seat_wanted-1]:
assigned[seat_wanted-1] = True
return True, assigned
return False, assigned
else:
for i in range(len(preferences)):
current = preferences[i]
for seat in current[1]:
found, assigned = seat_team(num_seats, [preferences[i]], assigned)
if not found:
return False
found, assigned = seat_team(num_seats, preferences[i+1:], assigned)
if not found:
return False
return True
num_seats = 4
preferences = [(1,[1,3,2]), (2,[1]), (3,[4,3]), (4,[4,3])]
assigned = [False] * num_seats
print seat_team(4, preferences, assigned)
有什么想法吗?我确信这种问题有一个通用的名称,以及解决它的算法,但我无法在线找到类似的问题(或解决方案)。如果您知道,请分享示例,我真的很感激。
答案 0 :(得分:5)
集合S代表M个顶点,每个顶点属于一个成员,集合T代表N个顶点,每个顶点用于一个座位。如果i th 成员想要j th 席位,则从S i 到T j 存在边缘。这是二分图。如果maximum matching出现为M,那么我们就不会有解决方案。
答案 1 :(得分:3)
做吧。编写一个回溯算法,将人们分配到座位,如果每个人都可以坐下,则返回真/假。在小输入上测试它以检查它是否正确。然后在大输入上尝试它。根据需要进行优化。
优化的想法:
在网站上试过。回溯算法得分为80.在进行第二次优化(定期检查霍尔条件)后得分为100