前两天写了携程的一道笔试题,感觉题目质量挺不错,这里记录一下。
题目大意如下:
现有n套试卷,每套试卷包含的题目数是i。游游每天的早上和下午都可以选择做一套试卷,当然也可以选择摸鱼(不做题),但是必须满足游游每天做的题目是k的整数倍。求游游最多可以做几天的题?
输入:第一行是n,k;第二行是每套试卷的题数组成的一个数组。
输出:游游最多可以做多少天的题?
样例输入:
5 3
1 2 3 4 5
样例输出:3
样例解析:
其实这题难在:如何匹配?比如说你怎么知道1要和5搭配,而2就和4搭配?因此暴力的方法行不通。于是尝试考虑使用动态规划的方法。这题用dp来解就非常巧妙。
我们令dp[i] 表示第i套卷可以得到的最大天数。 这个令的过程是dp的精华,当然这也不是我一个人想出来的,小师妹跟我一起思考这个问题,然后我就想出来了。
得到假设之后,就需要考虑怎么得到递推式了,即dp[i] 与 dp[i-1]的关系。 其实主要分成两部分:
上面这个思想的代码能直接AC笔试题,这里不再给出了。