摘要: 有n个士兵,每个士兵知道不同的军事秘密,每两个士兵可以通过一次交流来互相知晓对方掌握的信息,现设计最优的策略来使得通过最少的交流次数使所有士兵知道所有军事秘密,并给出最优策略所需的交流次数。(给出算法思路,计算次数)网络思路:使用归并法,设前n/2个士兵组成的集合A互相知晓集合内所有士兵的秘密,不知道其他任意士兵的秘密,后n/2个士兵组成的集合B也只知道自己集合内部的所有秘密。从集合A中取一个士兵a,从集合B中取一个士兵b,让a、b互相交流之后,则a、b知道了所有的军事秘密,经过n/2次上述操作后,算法完成。对于集合A内部的士兵,用同样的方法分为两个小集合进行同样的操作。基本操作和归并排序类似 阅读全文
posted @ 2013-05-24 19:40 legendmaner 阅读(306) 评论(0) 推荐(0) 编辑
摘要: 阿里的题目:有n-1个群众和1个明星,群众两两间可能认识也可能不认识,但是群众都认识明星,明星不认识其他任何人。现在每次询问一个人是否认识另一个人的时间复杂度是O(1),要求找出明星的时间复杂度。笔试时,完全不知道在写什么。题目似乎都没有分析清楚。胡搞了一番,老是对着“群众都认识明星”这个point思考。结论就是O(n^2),晕。其实,切入点应该为“只有一个明星,群众都认识明星,明星不认识群众”(说等没说),引用网络得出的一个重要的结论:首先分析一次询问的效果。is A 认识 B? (yes) A不是明星,B可能是明星 : (no) A可能是明星,B是群众。所以一次询问可以确定一个人。所以一次 阅读全文
posted @ 2013-05-24 16:52 legendmaner 阅读(552) 评论(0) 推荐(0) 编辑
摘要: 链表是每一个程序员必学的一个数据结构。理解上并不是很难,但是它却很常用。所以我们为了避免重复造轮子,所以一个好的设计就显得格外的重要了。如果在C++中我们可以很容易的想到模板编程。可是在纯C的环境下就没有什么简单了。为了避免重复的工作,先把工作中重复的部分提取出来。比如说是循环双向链表。每一个节点包含了前一个元素指针和后一个元素的指针。为了操作的便利,我们会使用到带头节点的方式。前后指针的是每一种循环双向链表节点要包括的数据结构,所以就可以想办法把其抽离出来,这里给出了linux下的list的实现的简版。(如果你参与过window下的驱动开发,应该也会发现这种实现方式的list) 1 #in. 阅读全文
posted @ 2013-05-24 15:08 legendmaner 阅读(254) 评论(0) 推荐(0) 编辑
摘要: 一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。老早就想把这道题目写了,一直没写;N天不碰算法,思维完全钝了。网络上的解法思路(见附),都是一直的。那如果再说一模一样的就没太大意思,除了记录题目和增加网络冗余度之外;其实这里说的和网络大部分也是一样的,但是,解释稍微转变,希望让你这透彻的看懂它。经一番琢磨,题目很网上的解释包含了一个很简单的思想,“单调栈”,哈哈,是不是很熟悉呢?如果想不起来,就回去看看其他博文中的题目吧:单调栈:柱形统计图中最大面积(POJ 2559)谁看得最大(使用了单调 阅读全文
posted @ 2013-05-20 19:07 legendmaner 阅读(1132) 评论(0) 推荐(0) 编辑
摘要: 给定含有n个元素的整型数组a,其中包括0元素和非0元素,对数组进行排序,要求:1、排序后所有0元素在前,所有非零元素在后,且非零元素排序前后相对位置不变2、不能使用额外存储空间例子如下输入 0、3、0、2、1、0、0输出 0、0、0、0、3、2、1关注题目要求:非零元素排序前后相对位置不变, 只要求的是非零元素而已是不是想起了之前的一道题目,不改变正负数之间相对顺序重新排列数组.时间O(N),空间O(1)直接copy网上代码: 1 void Arrange(int *arr , int n) 2 { 3 int i , k = n-1; 4 for(i = n-1 ; i >=... 阅读全文
posted @ 2013-05-14 20:47 legendmaner 阅读(831) 评论(2) 推荐(0) 编辑
摘要: 在经过了一系列问题的铺垫之后,终于来到boss这关了。。均分纸牌石子合并问题矩阵连乘糖果传递问题(和仓库运输问题一样的,这里给出糖果传递的题目):老师准备了一堆糖果,恰好n个小朋友可以分到数目一样多的糖果.老师要n个小朋友去拿糖果,然后围着圆桌坐好,第1个小朋友的左边是第n个小朋友其他第i个小朋友左边是第i-1个小朋友。大家坐好后,老师发现,有些小朋友抢了很多的糖果,有的小朋友只得到了一点点糖果,甚至一颗也没有,设第ai个小朋友有ai颗糖果.小朋友们可以选择将一些糖果给他左边的或者右边的小朋友,通过”糖果传递”最后使得每个小朋友得到的糖果数是一样多的,假设一颗糖果从一个小朋友传给另一个小朋友的 阅读全文
posted @ 2013-05-07 20:58 legendmaner 阅读(993) 评论(0) 推荐(0) 编辑
摘要: 均分纸牌[问题描述] 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例如 N=4,4 堆纸牌数分别为: ① 9 ② 8 ③ 17 ④ 6 移动3次可达到目的: 从 ③ 取 4 张牌放到 ④ (9 8 13 10) -> 从 ③ 取 3 张牌放到 ②(9 ... 阅读全文
posted @ 2013-05-06 10:27 legendmaner 阅读(1472) 评论(0) 推荐(0) 编辑
摘要: 石子合并问题想了N久,想原创性的从另一个角度分析问题。。。然后没想出来。。。再然后就无耻的把别人的copy了一份(原文):时限:1000ms 内存限制:10000K 总时限:3000ms描述:在一个圆形操场的四周摆放着n堆石子(n<= 100),现要将石子有次序地合并成一堆。规定每次只能选取相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。编一程序,读入石子堆数n及每堆的石子数(<=20)。选择一种合并石子的方案,使得做n-1次合并,得分的总和最小;比如有4堆石子:4 4 5 9 则最佳合并方案如下:4 4 5 9 score: 08 5 9 score: 813 阅读全文
posted @ 2013-05-06 09:28 legendmaner 阅读(1310) 评论(2) 推荐(1) 编辑
摘要: 矩阵连乘问题:先考察3个矩阵{A1,A2,A3}连乘,设这三个矩阵的维数分别为10×100,100×5,5×50。若按((A1A2)A3)方式需要的数乘次数为10×100×5+10×5×50=7500,若按(A1(A2A3))方式需要的数乘次数为100×5×50+10×100×50=75000。矩阵连乘问题是《算法导论》的一道经典题目;思想:将一系列相乘的矩阵(Ai....Aj)划分为两部分;即(AiAi+1...Ak)(Ak+1Ak+2....Aj),k的位置要保证左边括号和右边括号 阅读全文
posted @ 2013-05-05 20:52 legendmaner 阅读(1131) 评论(0) 推荐(0) 编辑
摘要: Ackerman问题:ackerman(m,n)= (n+1) [m=0] ackerman(m-1,1) [m<>0, n=0] ackerman ( m-1 , ackerman(m , n)) [m<>0, n<>0] 1 int ackerman(int m, int n) //递归算法 2 { 3 if (m==0) 4 { 5 return n+1; 6 } 7 else if (n ==0 ) 8 { 9 return ackerman(m-1, 1);10 }11 else12 {1... 阅读全文
posted @ 2013-05-05 10:50 legendmaner 阅读(299) 评论(0) 推荐(0) 编辑