http://www.blogjava.net/ebecket 返还网
随笔-140  评论-11  文章-131  trackbacks-0
A:你让某些人为你工作了七天,你要用一根金条作为报酬。这根金条要被分成七块。你必须在每天的活干完后交给他们一块。如果你只能将这根金条切割两次,你怎样给这些工人分?

Q
先把金条平均分为七份(不切割)

第一次切割七分之一 第二次切割七分之二

这样就分为三段 七分之一一段 七分之二一段 七分之四一段

然后根据每天工作量交换就好了




切成1段,2段,和四段.
1:给出1.
2:给出2,还回1.
3:给出1.
4:给出4,还回3.
5:给出1.
6:给出2,还回1.
7:给出1.

7 = 1 + 2 + 4,分成三段,截2次,由上述“切成1段,2段,和四段”感觉1、2、4有一定的规律性,由此联想到了下面的递归等式
2^n -1 = (2^n -1)/(2 – 1 ) = 1 + 2 + …. 2^(n-1) 》》》S(n) – 1 = 1 + 2 + … S(n-1)
其中S(n) = 2^n, S(0) = 1
等比数列求和的问题,即最后一项为前面所有项的和再加1
这里的加1就相对于每天的工资,故每天给新的金条时要将前面的相应项和的对应金条取回。
 
如果为15,则是截三次,分别为1 2 4 8,便可处理任意的整数了
 
即以零换整的问题,钞票为什么设计成 1 2 5 10,估计是上述四个数可以以最小的张数组合任意的整数,哈哈,不会出现别人给你整票不能够找开的问题了。有兴趣的朋友可以用程序证明1 2 5 是最高效的方法,我猜是的,要不然为什么全世界都是这么设计的呢?
 
反向推理:一根金条平均分成N段相连,每天的工资为一段,最少截成几段才能每天完工后付给工人当天的工资?
2^(n-1) – 1 < N =< 2^n -1
最小的n值必须满足上述不等式
即(2^(n-1) – 1 ,2^n -1]半开半闭区间内的N值都至少分成n段才能解决当天完毕付工资问题
利用上述不等式,即可针对任意的N值快速算出分段次数了,不管面试者如何改动N值,都是易如反掌了,以一敌百,轻松搞定

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/TanXiangHao/archive/2008/10/14/3072905.aspx

posted on 2010-01-20 01:50 becket_zheng 阅读(485) 评论(0)  编辑  收藏 所属分类: 考智力

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问