在 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 Day3
和 Chapter5 on Day4
。
我理解这个想法应该是最小化阅读总页数与一天应该 'ideally' 阅读的平均页数的绝对差之和。但是,我无法将这个想法转化为数据结构和算法。任何其他想法或意见表示赞赏。
你可以使用动态规划。
平均值等于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)
.
此解决方案基于我们的目标是 "minimize the sum of absolute differences of total pages read with the average number of pages that one should 'ideally' read on one day" 的假设。
但是如果问题陈述没有说明最优的标准是什么,我会建议尽量减少一天内阅读的最大页数(在我看来,目标是不要连续阅读太多使得更多感觉)。对于这种情况,有一个更简单高效的解决方案:
我们可以对答案进行二分搜索,并使用贪心算法来检查固定候选者是否可行。
我遇到了这个面试问题:给定一本有 N 章的书(每一章当然有不同的页数),在 M 天内完成整本书的最佳方式是什么?当天看完。
示例:
Chapters[] = {7, 5, 3, 9, 10}
Days = 4
应该阅读:
Chapter1 on Day1
, Chapters2 and Chapter3 on Day2
,
Chapter4 on Day3
和 Chapter5 on Day4
。
我理解这个想法应该是最小化阅读总页数与一天应该 'ideally' 阅读的平均页数的绝对差之和。但是,我无法将这个想法转化为数据结构和算法。任何其他想法或意见表示赞赏。
你可以使用动态规划。
平均值等于
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)
.
此解决方案基于我们的目标是 "minimize the sum of absolute differences of total pages read with the average number of pages that one should 'ideally' read on one day" 的假设。
但是如果问题陈述没有说明最优的标准是什么,我会建议尽量减少一天内阅读的最大页数(在我看来,目标是不要连续阅读太多使得更多感觉)。对于这种情况,有一个更简单高效的解决方案: 我们可以对答案进行二分搜索,并使用贪心算法来检查固定候选者是否可行。