我被要求为2016年ICPC世界总决赛问题L编制解决方案,作为家庭作业。
我成功地创建并运行了一个解决问题的程序。但是,如果有更好的算法来解决问题,我很好奇。
问题L如下:
需要重新格式化一组
n
个硬盘驱动器。重新格式化驱动器i
后,其容量将从a_i
GB变为b_i
GB。所有的硬盘驱动器最初都是满满的。为了存储来自硬盘x
的数据 它正在重新格式化,您可以购买额外的硬盘。 任何已重新格式化的驱动器都可用于存储更多数据 (假设它有能力这样做)。来自硬盘x
的数据 可以与其他硬盘分开。写一个估计的程序 重新格式化所需的最小额外空间 硬盘驱动器,不会丢失数据。
我目前使用的算法与this YouTube video中的算法相同。
该算法遵循以下步骤:
将重新格式化时丢失容量的硬盘与重新格式化时保持或增加容量的硬盘分开。
按硬盘的初始容量对新列表进行排序。失去容量的人(称为"收缩列表")从最大到最小排序,其他(称为"成长列表")从最小到最大排序。
从增长列表的第一个成员开始,检查其启动容量并将该值分配给 swap (成功交换数据所需的累积空间)。
重新格式化硬盘后,指定 extra 从重新格式化第一个硬盘驱动器获得的容量(第一个值始终至少为0)。
< / LI>比较要重新格式化的下一个硬盘驱动器(硬盘x
)的初始容量,以及 swap + extra 的值。如果 swap + extra 至少等于硬盘驱动器x
的初始值,则可以重新格式化硬盘驱动器。
如果 swap + extra 的值小于硬盘x
的初始容量,请增加 swap的值直到您有足够的容量进行交换,并重新格式化驱动器x
。
添加额外硬盘x
的最终和初始容量之间的差异,即使它是负值。
返回步骤5,直到成长列表的所有成员都重新格式化。
重新格式化成长列表的所有成员后,返回步骤5,但现在使用缩小列表。
是否有更好/更快的方法来解决这个问题?