zoukankan      html  css  js  c++  java
  • 寻找假币问题

    有n (n>=3)个硬币,其中一个是假币,已知假币的重量比其他的要重一些,你有一架天平。现在要称出那个是假币来。

    解析:

    首先我们先来考虑最简单的问题1.为了方便叙述,把n个硬币按1,2...,n顺次编号。

    若n=3,把一号硬币放在天平左边,二号币放在天平右边。如果天平:

    1.左偏,一号重,是假币。

    2.右偏,二号重,是假币。

    3.保持平衡,那么一二都是正常的硬币,因此只有可能三号是假币了。

    因此n=3,至多一次就能称出哪个是假币,记作f(3)=1.

    下面考虑n=9.把所有硬币分成三组,a{1.2.3} B{4.5.6} C{7.8.9}。A组的硬币放在左边,B组放在右边。如果天平:

    1.左偏,则假币在A里面。

    2.右偏,则假币在B组里面。

    3.保持平衡,在C组。

    无论在哪个组里面,我们已经把假币的范围从9缩小到3,也就是减少到了原来的1/3.之前我们研究过,3个硬币1次就能称出来,故而f(9)=2.

    不难推广到一般情况:

    定理1.1 f(3n)=n

    证明:n=1,2时,已证。设n=k成立,则f(3k)=k;下面考虑n=k+1的情况。

    将3k+1个硬币分成三堆,使得|A|=|B|=|C|=3k。把A放在天平左边,B放在右边。

    天平:

    1、左偏,假币在A

    2、右偏,假币在B

    3、平衡,假币在C

    无论哪种结果,我们都把假币的范围缩小到了3k个硬币里面。而f(3k)=k,故而f(3k+1)=k+1。

     综上,定理1.1成立。

    稍经分析不难得到:

    定理1.2 f(n)=(log3n) 向上取整

    这个证明和定理1.1完全类似,分n mod 3 = 0, 1, 2适当讨论即可。

    我们必须注意到(log3n) 向上取整是可行的,应为我们能构造出这样一个方案。问题是它是不是最优的?

    我们采取的方案是每次将硬币尽量均匀的分成三份,这样做的根据就是天平只有三种结果:左偏,右偏,平衡。于是就能保证无论假币在哪一份都能将结果的范围缩小到原来的1/3.从感性上认识,这应该是最优的了。

    为了更加严格的证明最优性,我们引进判定树的概念。

    下图就是n=9时的一种判定树:

    1、叶子节点代表一种可能的结果。

    2、非叶子节点代表一次称量。

    3、非叶子节点至多有三个儿子,分别代表天平的左偏、右偏、平衡三种情况。

    任意一种称量方案都能唯一的表示成一棵判定树;反过来一棵判定树也唯一对应一种称量方案。

    容易看出判定树的深度就是称量次数。这就是我们之所以引进它的原因。

    做出判断之前,谁也无法预知哪个硬币是假币,每个都有可能是我们的目标;因此一个有意义的判定树应该具有至少n个叶子节点。

    n个叶子节点的树的深度h ≥ log3上取证,故而可以证明,f(n)=log3 上取整是最优的。

    我们的结论是:有nn3次,就能找出那个假币。)个硬币,其中一个是假币,假币的重量比其他的要重一些。给一架天平,至少称次,就能找出那个假币。

    具体的方案是将硬币每次都尽量均匀的三分。

    让我们总结一下。

    “三分”是整个解法的核心。我们选择三分,而不是二分或者四分是有原因的,它的本质是由判定树的特殊结构——三叉树——所决定的。

    同时还必须注意一点,我们在三分的时候有两个字很讲究:“均匀”。实际上h ≥中的‘=’当且仅当硬币被均匀地分配时才能到达。

    这里说的“均匀”是指“在最坏情况下获得最好的效果”。因为一棵树的深度是由它根节点儿子中深度最大的儿子决定的,为了使得整个树深度最小,我们就要务必使得深度最大的儿子深度最小,这就是“均匀”分配的理论根据。

    练习:第 12 届全国青少年信息学奥林匹克联赛初赛题 现有 80枚硬币,其中有一枚是假币,其重量稍重,所有真币的重量都相同,如果使 用不带砝码的天平称重,最少需要称几次,就可以找出假币?你还要指出第1次的称重方法。请写出你的结果:

    答案:4次 ;第一步,分成三组:27,27,26,将前2组放到天平上。

  • 相关阅读:
    JS-函数
    JS-数组
    JS-2
    课堂小技巧
    CSS利用filter/opacity实现背景透明
    [技巧心得] 背景半透明最佳实践
    Cadence Orcad 无法启动出现Capture.exe找不到cdn_sfl401as.dll问题
    正则表达式
    python小项目之头像右上角加数字
    Django开发之路 二(django的models表查询)
  • 原文地址:https://www.cnblogs.com/rmy020718/p/9443128.html
Copyright © 2011-2022 走看看