我遇到了这个采访问题:鉴于一本有N章的书(每章当然都有不同的页数),在M天完成整本书的最佳方法是什么,其中一章必须是在同一天完全阅读。
示例:
Chapters[] = {7, 5, 3, 9, 10}
Days = 4
应该读:
Chapter1 on Day1
,Chapters2 and Chapter3 on Day2
,
Chapter4 on Day3
和Chapter5 on Day4
。
我理解这个想法应该是将读取的总页数的绝对差异总和与一天应该“理想”读取的平均页数最小化。但是,我无法将这个想法转化为数据结构和算法。任何其他想法或输入都表示赞赏。
答案 0 :(得分:3)
您可以使用动态编程。
平均值等于totalNumberOfPages / numberOfDays
,并不取决于我们阅读本书的方式。
状态是(我们已经完成的章节数,我们已经花费的天数)。状态值是目前为止的绝对差值的最小总和。
f(0, 0) = 0
。
转换如下:
假设当前状态为(chapters, days)
。
我们可以迭代我们将在第二天阅读的章节数量(我将其称为add
)并进行以下转换:f(chapters + add, days + 1) = min(f(chapters + add, days + 1), f(chapters, days) + abs(average - the number of pages in chapter + 1 ... chapter + add chapters).
答案是f(totalNumberOfChapters, totalNumberOfDays)
。
这个解决方案是基于这样一个假设,即我们的目标是尽可能减少读取的总页数的绝对差值之和与理想情况下的平均页数之和。在一天阅读"。
但是如果问题陈述没有说明最优性的标准是什么,我建议最小化一天内读取的最大页数(在我看来,连续读取的目标不是很有意义) 。在这种情况下,有一个更简单有效的解决方案: 我们可以对答案进行二分搜索并使用贪婪算法来检查固定候选是否可行。