我正在解释这个问题,几乎没有任何修改,因此我很容易解释。
有 n 员工,我需要在一个月的所有(或最多)员工可以出去的那一天为他们安排一次郊游。
要求每位员工填写一份在线调查,说明他的可用性,例如: 1-31或15-17等等。有些甚至一天也可能无法使用。 我必须安排覆盖所有员工的旅行次数没有限制(不考虑整个月的人员不可用),但我想找出最小的日期,以便涵盖所有员工。因此,在最坏的情况下,我将不得不安排行程31次。
问题:我可以使用哪种最佳数据结构在此数据结构上运行最佳拟合算法?解决这个问题的最佳方法是什么?
当然,我的意思是时间和空间的有效方式,但我也在寻找其他方法来解决它。
我认为的方法是维护一个31个整数的数组并将其初始化为0.运行每个员工并根据他们的可用日期递增数组索引。最后将数组排序为31.最大值表示qhich max员工可用的日期。并在左侧员工身上应用相同的逻辑。但问题是要删除遗漏的员工。为此,我将不得不在整个员工名单上运行一次,以了解哪些员工可以被删除,并形成一个新的剩余员工列表,我可以在其中应用之前的逻辑。根据我的说法,以这种方式两次运行列表以移除员工并不是最好的。有什么想法吗?
答案 0 :(得分:0)
作为第一步,您应该排除没有可用日期的员工。
然后,您的问题将成为Set Cover Problem的变体。
您的Universe U
是所有员工,集合S
的集合是天。对于每天i
,如果该员工在j
日有空,则员工S[i]
已设置为i
。
这个问题是NP难的。因此,除非您需要近似解决方案,否则必须检查每个31^2
天的组合,可能需要进行一些修剪。
答案 1 :(得分:0)
从1到31中选择一个数组(每个索引代表一个月的日期)。对于每个日期,您必须创建链接列表(加倍)包含当天可用的emp_id(您可以同时创建此列表它将根据emp_id进行排序,您可以保留有关列表大小和最大员工数组索引的信息。 最大的列表必须在解决方案中(将其作为第一个日期)。 现在将每个列表与最大列表进行比较,并从列表中删除已存在于所选最大列表中的那些员工。 现在做相同的程序,找到第二个日期等等...... 整个过程将在O(n ^ 2)中运行(因为31是一个常数值)。 和空间将是O(n)。