随笔分类 -  算法

约瑟夫问题
摘要:经典的Joseph问题吧,说有n个要被处决的人(编号0~(n-1)),从0开始报数,报到(m-1)的会被杀掉,剩下的人继续从0开始报数,如此下去最后剩的一个人会存活下来: 很明显剩下未处死的人编号为0我们来研究一下相邻两次的操作:x:012345……m-2m-1mm+1……n-1n人y:n-2删除01n-1人对比这两次操作发现 同一人的序号 之间的关系:x=(y+m)%n因此可以从后往前递推: 存活人序号:(最后一次) :t=0 (倒数第二次) :t=(t+m)%2 (有2人) (倒数第三次):t=(t+m)%3 (有3人)因此: 核心算法:int ans=0;//存活人最... 阅读全文

posted @ 2012-08-21 18:18 gcpopo 阅读(135) 评论(0) 推荐(0)

【转】贪心算法的一个出人意料的应用
摘要:IBM Ponder This上个月的题目比较有趣:我在心里面想一个2到166之间的整数(包括2和166),你的任务是用尽可能少的是非问句(我只能回答是或者否)猜出这个数除1以外的最小约数是多少。(1) 寻找一种策略使得在最坏情况下猜到答案的询问次数最少。(2) 寻找一种策略使得在平均情况下猜到答案的期望询问次数最少。第一个问题很容易回答。虽然2到166之间的整数一共有165个,但它们的最小约数(以后我们说的“最小约数”都是指的不包括1的最小约数)只有38种。因此,事实上你只需要用二分法在38个可能的答案当中找出一个就可以了。由于2^5=32,2^6=64,因此最坏情况下需要6次询问才能保证猜 阅读全文

posted @ 2012-08-20 21:15 gcpopo 阅读(215) 评论(0) 推荐(0)

导航