在 M 天内阅读一本有 N 章的书的最佳方式

Optimal way to read a book having N chapters in M days

我遇到了这个面试问题:给定一本有 N 章的书(每一章当然有不同的页数),在 M 天内完成整本书的最佳方式是什么?当天看完。

示例:

Chapters[] = {7, 5, 3, 9, 10}
Days = 4

应该阅读:

Chapter1 on Day1, Chapters2 and Chapter3 on Day2, Chapter4 on Day3Chapter5 on Day4

我理解这个想法应该是最小化阅读总页数与一天应该 'ideally' 阅读的平均页数的绝对差之和。但是,我无法将这个想法转化为数据结构和算法。任何其他想法或意见表示赞赏。

你可以使用动态规划。

  1. 平均值等于totalNumberOfPages / numberOfDays,与我们看书的方式无关

  2. 状态是(我们完成的章节数,我们已经度过的天数)。一个状态的值是目前为止的最小绝对差之和

  3. 基本情况 f(0, 0) = 0.

  4. 转换如下:

    • 假设当前状态为(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).

  5. 答案是f(totalNumberOfChapters, totalNumberOfDays).

此解决方案基于我们的目标是 "minimize the sum of absolute differences of total pages read with the average number of pages that one should 'ideally' read on one day" 的假设。

但是如果问题陈述没有说明最优的标准是什么,我会建议尽量减少一天内阅读的最大页数(在我看来,目标是不要连续阅读太多使得更多感觉)。对于这种情况,有一个更简单高效的解决方案: 我们可以对答案进行二分搜索,并使用贪心算法来检查固定候选者是否可行。