九章算法面试题2 抄书问题

九章算法官网-原文网址:

http://www.jiuzhang.com/problem/2/


题目

有n本书和k个抄写员。要求n本书必须连续地分配给这k个抄写员抄写。也就是说前a1本书分给第一个抄写员,接下来a2本书分给第二个抄写员,如此类推(a1,a2需要你的算法来决定)。给定n,k和每本书的页数p1,p2..pn,假定每个抄写员速度一样(每分钟1页),k个抄写员同时开始抄写,问最少需要多少时间能够将所有书全部抄写完工?(提示:本题有很多种算法可以在不同的时间复杂度下解决,需要尽可能的想到所有的方法)


解答

解法1:动态规划

设f[i][j]代表前i本书分给j个抄写员抄完的最少耗时。答案就是f[n][k]。状态转移方程f[i][j] = min{max(f[x][j-1], sum(x+1, i)), j

时间复杂度O(n^2*k)


解法2;动态规划+决策单调。

同上一解法,但在x的枚举上进行优化,设s[i][j]为使得f[i][j]获得最优值的x是多少。有s[i][j-1]>=s[i][j]>=s[i-1][j]。因此x这一层的枚举不再是每次都是n而是总共加起来n。

时间复杂度O(n*k)


解法3:二分答案

二分答案,然后尝试一本本的加进来,加满了就给一个抄写员。看最后需要的抄写员数目是多余k个还是少于k个,然后来决定是将答案往上调整还是往下调整。

时间复杂度O( n log Sum(pi) )


面试官角度

该问题的考点在于算法能力。需要一定的算法积累,如对动态规划和二分法的算法积累。面试官不一定会需要你答出所有的解法(根据职位要求和招聘名额来看了),但是你答出多少就能够大概知道你在算法能力上的水平是多少。一般来讲至少需要答出动态规划的解法,因为只要稍微做过一点动态规划的训练,都是可以想出来的。


你可能感兴趣的:(九章算法面试题)