摘要: 1.7 光影切割问题题意:给定n条直线,计算它们在某个水平区间内相交所划分的区域数。注:不存在三条直线相交于一点的情况。解法一首先从划分的区域数目和交点的关系开始考虑,通过观察小样本的数据与归纳,发现区域数等于直线数N+交点数M+1。故可以根据直线数据,计算相交的情况,判定交点的区间位置,最终得到划分区域的个数。解法二的逆序数的方法是个很好的解法,充分利用了问题的特性(若线的顺序交错,则必然是相交的),并将其与简单数学模型对应起来,避免了交点坐标计算与区间判定。由于问题并没有要求给出具体的区域信息,所以在处理问题的时候,若能找到适合的逻辑关系,就可以避免具体的数值计算。1.8 小飞的电梯调度算 阅读全文
posted @ 2012-10-19 11:36 罗辑 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 1.6 饮料供货题意:有若干种饮料,给出每种饮料的ID、单位容量(为2的方幂)、总数量和满意度。给定总容量限额,求最大满意度的购买方法。看了解法一的讨论,本人直接想到的就是记忆化的DFS,但是解法一给出的是动态规划的解法,计算所有子状态,反推出解。这种解法的缺点很明显,有些状态可能根本不可能到达,浪费了资源,另外笔者个人觉得此法看起来不如DFS直观,还要做边界预处理。解法二是一种常用的搜索方法,在搜索的同时记录已经计算过的状态还能提高效率,代码也是直观明了。实际上本题目应该是为解法三设计的,我们在解这个问题的时候没有注意到饮料单位容量为2的方幂,利用这个条件,贪心的方法就足够了。但是,笔者还是 阅读全文
posted @ 2012-10-18 17:35 罗辑 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 1.5 快速找出故障机器题意:给n个不同的数组成集合A,初始集合B等于集合A,若集合B中有元素丢失,把集合A和B中所有元素装进容器S,如何利用集合A和容器S快速找到丢失元素?解法一的思路很直接,统计所有数字在容器S中出现次数之和,若出现次数为1(即只在集合A中出现),那么这个数字就是丢失的。优点是无论丢多少数字都能找出来,缺点很明显,空间复杂度太高。解法二实际上是解法一的改进,我们只需要找出出现一次的元素,所以出现两次的结果没必要保存。相对解法一,空间复杂度在运气好的情况下可以为O(1),运气不好则还是O(N)。解法三的想法是,将容器S中所有元素相异或,若丢失一个元素,则出来的结果就是丢失的元 阅读全文
posted @ 2012-10-16 12:25 罗辑 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 1.3 一摞烙饼的排序题意:一摞大小不一的烙饼,一次抓住最上面的几块饼,上下颠倒,反复几次,实现大的在下面,小的在上面。解法一是一种非常清晰明了的解法,把最大的饼翻到最上面,再翻转整摞烙饼,把次大的翻到最上面,再把次大的翻转到最大的上面……如此反复2(n-1)次,整个都是有序的了。文章后面讨论是如何找出最优的翻转方案,而不是给出一个翻转算法,暂不讨论。对于翻转算法来说,解法一的复杂度已经比较小了,而且清晰明了。因此,笔者并没有太多的想优化这个算法的想法。这个算法让笔者想起了著名的KISS原则——“Keep It Simple, Stupid!”1.4 买书问题这道题目动态规划解法是一个很好的选 阅读全文
posted @ 2012-10-15 15:15 罗辑 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 1.1 让CPU占用率曲线听你指挥题意:写程序来控制任务管理器中CPU的占用率,使得占用率曲线达到某种样式。任务管理器是通过定期对CPU的状态采样来获得占用率的,如果我们保证在采样间隔内占用率相同,那么曲线就会是一条直线。由于CPU的工作状态是离散的,我们是无法做到真正的50%占用的这种状态,指令只有执行和不执行之分,没有执行一半的说法。我们只能努力使得在一个微分的时间片内,CPU有50%的时间工作,50%的时间空闲,这样从宏观上来看,的确是50%的占用。书中第一个例子的缺点是依赖于具体的CPU,在一个时间片内,它使用Sleep来设定10ms的占空时间,使用CPU的频率来估计工作的时间。第二个 阅读全文
posted @ 2012-10-14 22:12 罗辑 阅读(245) 评论(0) 推荐(0) 编辑