随笔 - 15  文章 - 0 评论 - 0 阅读 - 4243
< 2025年7月 >
29 30 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 1 2
3 4 5 6 7 8 9

10 2012 档案
编程之美 第2章 数字之魅——数字中的技巧(十二)
摘要:2.1 求二进制数中的1的个数题意:8bit无符号整型变量N,求其中二进制位中1的个数。解法一,笨方法,使用除法和模运算,即使编译器能帮人优化,但解法的思想并没有走到位这个概念上去。解法二是笔者首先想到的解法,即与0x01进行与运算,判断是否为1,之后再右移,这个方法清晰明了,虽说复杂度为O(log2N)级别,但和再小的复杂度差别不大。解法三的确是一个非常巧妙的方法,复杂度只和1的个数有关,每次循环都消去最低位的1,最终得到1的个数。解法四有点走火入魔了,写代码都累死,说是空间换时间,写代码的时间不算?解法五可以说是解法四的改良版本,直接hashtable就OK,算是先把结果算好存着。若改成3 阅读全文
posted @ 2012-10-26 15:51 罗辑 阅读(195) 评论(0) 推荐(0)
编程之美 第1章 游戏之乐——游戏中碰到的题目(十一)
摘要:1.17 俄罗斯方块游戏题意:俄罗斯方块游戏的逻辑设计。总的来说,这道题目并没有什么难点,有点偏工程化的东西,按照游戏规则进行相关设定,然后编写代码即可。1.18 挖雷游戏题意:windows系统自带的扫雷游戏,添加每个方格里面是否有地雷的概率。概率这个东西,这里只谈一下100%的情况,即从局面上判定哪些方块肯定是有地雷的。假设有两个集合A和B,B包含于A,A里面的元素都是没有点开的方块,|A|=x,|B|=y,A和B对应的地雷数目分别是m和n。如果x-y==m-n,那么A-B里面的方块下面都是地雷。 阅读全文
posted @ 2012-10-26 13:52 罗辑 阅读(237) 评论(0) 推荐(0)
编程之美 第1章 游戏之乐——游戏中碰到的题目(十)
摘要:1.16 24点游戏题意:给定4个数,运用加减乘除和括号,构造多项式,使得结果等于24。解法一是穷举法,四个数字有4!排列,运算符号有43种可能,外加5种加括号的方式。为什么是5种?书上没说,推断如下:括号决定先算什么,最先需要算的两个数决定了3种可能组合,那么我们可以得到:ABCD->(AB)CD, A(BC)D, AB(CD)把一个括号内的看成一个数字,那可以认为,上一步把4个数字变成了3个,现在需要把3个数字变两个,那么可以继续:(AB)CD->((AB)C)D,(AB)(CD)A(BC)D->(A(BC))D,A((BC)D)AB(CD)->(AB)(CD),A 阅读全文
posted @ 2012-10-25 15:41 罗辑 阅读(235) 评论(0) 推荐(0)
编程之美 第1章 游戏之乐——游戏中碰到的题目(九)
摘要:1.14 连连看游戏设计题意:设计连连看游戏。这道题目最关键的问题是,连连看游戏中的寻路问题,这个寻路和以往的最短路径稍微有点不一样,这里是要找一个转弯数目最少的路径。使用BFS进行搜索,需要重新定义一下最短路径的概念,这里的路径长短不再按照实际距离来算,而是按照转弯的数目来算,转弯数目越少,则路径越短。算法搜索的时候也是一步一步进行移动的,从初始点出发,首先标记所有不用转弯就能直接到达的方格弯数为0,继而从这些弯数为0的方格进行扩展,标记所有弯数为1……如此反复下去,如果弯数为2还没有找到,则表明这并不是一次有效的连接。由于这里已经限制了弯数是要小于3的,所以笔者认为可以换一个角度考虑。1) 阅读全文
posted @ 2012-10-25 11:10 罗辑 阅读(211) 评论(0) 推荐(0)
编程之美 第1章 游戏之乐——游戏中碰到的题目(八)
摘要:1.12 NIM(2)“拈”游戏分析题意:给N块石头,玩家X把石头分成若干堆,然后按照XYXY...这样的顺序取石头,每次可以取一堆石头中的任意数目(大于0)个石头,谁先取完谁胜。此题目的关键在于证明一个规律,即N为偶数的时候,先动手的输,N为奇数时,先动手的人赢。假设N个石头被分成m堆,为(A1,A2,……,Am),最后取光了必定为(0,0,……,0),将此时(A1,A2,……,Am)全部异或操作,结果为0。三条结论:1)N为奇数的时候,XOR(A1,A2,……,Am)的结果为奇数,这个很明显。2)当XOR(A1,A2,……,Am)不等于0的时候,总有一种取石子的方法可以把XOR(A1,A2 阅读全文
posted @ 2012-10-22 14:42 罗辑 阅读(329) 评论(0) 推荐(0)
编程之美 第1章 游戏之乐——游戏中碰到的题目(七)
摘要:1.10 双线程高效下载题意:一个线程写磁盘,一个线程读网络,高效地实现下载。这道题放在这里感觉有点怪怪的,因为这个东东在并行程序设计里面是比较基础的。文章里面给了一个简单的信号量的方案,实现起来效果应该还是不错的,中规中矩。个人习惯,关于磁盘读写的问题,可以优先考虑内存文件映射,特别是后面关于多线程下载的情况,这样我们的代码只管写内存,写磁盘的问题让操作系统考虑去吧。1.11 NUM(1)一排石头的游戏题意:N个石头,每个石头都有一个ID,ID从1开始连续编号到N,每个玩家每次可以取任意一块石头,或者取编号相邻的两块石头,谁最后取完谁胜利。题目是从这样的分析得到解法的:1)一块和两块石头,一 阅读全文
posted @ 2012-10-21 22:23 罗辑 阅读(206) 评论(0) 推荐(0)
编程之美 第1章 游戏之乐——游戏中碰到的题目(六)
摘要:1.9 高效率地安排见面会题意:地图着色问题。这个问题是个没有高效算法的问题,看点主要是如何将见面会的安排转化为一个具体的数学模型——地图着色问题。扩展问题题意:带有时间段的见面会安排问题。书中开始便提到,这个题目是可以作为地图着色问题来做的,但不是最佳解法。第一个问题抽象后,所有信息都使用上了,恰好与地图着色问题相匹配,而扩展问题显然多了一些信息,其包含容斥关系是面试时间段信息的一个子集。普通的图无法直接包含进扩展问题中的时间先后关系信息,因而不是扩展问题的完整的数学模型,程序在搜索的时候会搜索大量多余的状态。所以,在解决问题的时候,尽量充分利用已有信息是很有必要的,它可能会有效减少解空间搜 阅读全文
posted @ 2012-10-20 15:39 罗辑 阅读(164) 评论(0) 推荐(0)
编程之美 第1章 游戏之乐——游戏中碰到的题目(五)
摘要:1.7 光影切割问题题意:给定n条直线,计算它们在某个水平区间内相交所划分的区域数。注:不存在三条直线相交于一点的情况。解法一首先从划分的区域数目和交点的关系开始考虑,通过观察小样本的数据与归纳,发现区域数等于直线数N+交点数M+1。故可以根据直线数据,计算相交的情况,判定交点的区间位置,最终得到划分区域的个数。解法二的逆序数的方法是个很好的解法,充分利用了问题的特性(若线的顺序交错,则必然是相交的),并将其与简单数学模型对应起来,避免了交点坐标计算与区间判定。由于问题并没有要求给出具体的区域信息,所以在处理问题的时候,若能找到适合的逻辑关系,就可以避免具体的数值计算。1.8 小飞的电梯调度算 阅读全文
posted @ 2012-10-19 11:36 罗辑 阅读(189) 评论(0) 推荐(0)
编程之美 第1章 游戏之乐——游戏中碰到的题目(四)
摘要:1.6 饮料供货题意:有若干种饮料,给出每种饮料的ID、单位容量(为2的方幂)、总数量和满意度。给定总容量限额,求最大满意度的购买方法。看了解法一的讨论,本人直接想到的就是记忆化的DFS,但是解法一给出的是动态规划的解法,计算所有子状态,反推出解。这种解法的缺点很明显,有些状态可能根本不可能到达,浪费了资源,另外笔者个人觉得此法看起来不如DFS直观,还要做边界预处理。解法二是一种常用的搜索方法,在搜索的同时记录已经计算过的状态还能提高效率,代码也是直观明了。实际上本题目应该是为解法三设计的,我们在解这个问题的时候没有注意到饮料单位容量为2的方幂,利用这个条件,贪心的方法就足够了。但是,笔者还是 阅读全文
posted @ 2012-10-18 17:35 罗辑 阅读(172) 评论(0) 推荐(0)
编程之美 第1章 游戏之乐——游戏中碰到的题目(三)
摘要: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 罗辑 阅读(234) 评论(0) 推荐(0)
编程之美 第1章 游戏之乐——游戏中碰到的题目(二)
摘要:1.3 一摞烙饼的排序题意:一摞大小不一的烙饼,一次抓住最上面的几块饼,上下颠倒,反复几次,实现大的在下面,小的在上面。解法一是一种非常清晰明了的解法,把最大的饼翻到最上面,再翻转整摞烙饼,把次大的翻到最上面,再把次大的翻转到最大的上面……如此反复2(n-1)次,整个都是有序的了。文章后面讨论是如何找出最优的翻转方案,而不是给出一个翻转算法,暂不讨论。对于翻转算法来说,解法一的复杂度已经比较小了,而且清晰明了。因此,笔者并没有太多的想优化这个算法的想法。这个算法让笔者想起了著名的KISS原则——“Keep It Simple, Stupid!”1.4 买书问题这道题目动态规划解法是一个很好的选 阅读全文
posted @ 2012-10-15 15:15 罗辑 阅读(206) 评论(0) 推荐(0)
编程之美 第1章 游戏之乐——游戏中碰到的题目(一)
摘要:1.1 让CPU占用率曲线听你指挥题意:写程序来控制任务管理器中CPU的占用率,使得占用率曲线达到某种样式。任务管理器是通过定期对CPU的状态采样来获得占用率的,如果我们保证在采样间隔内占用率相同,那么曲线就会是一条直线。由于CPU的工作状态是离散的,我们是无法做到真正的50%占用的这种状态,指令只有执行和不执行之分,没有执行一半的说法。我们只能努力使得在一个微分的时间片内,CPU有50%的时间工作,50%的时间空闲,这样从宏观上来看,的确是50%的占用。书中第一个例子的缺点是依赖于具体的CPU,在一个时间片内,它使用Sleep来设定10ms的占空时间,使用CPU的频率来估计工作的时间。第二个 阅读全文
posted @ 2012-10-14 22:12 罗辑 阅读(249) 评论(0) 推荐(0)

点击右上角即可分享
微信分享提示