zoukankan      html  css  js  c++  java
  • 有趣的天平秤假币问题

    问题描述:

        有12枚硬币,其中有一枚是假币,但是不知道是重还是轻。现给定一架没有砝码的天枰,问至少需要多少次称量才能找到这枚硬币?如何证明给出的方案是最少次数?

    思路分析:

        我们首先想到的可能是将12枚硬币分成两堆,每堆6枚放到天枰上称量,这样的得到的结果一定是天枰是倾斜的。得不到任何其他信息,反而白白浪费了一次称量机会。因此第一次称量一定是选择一部分去称量,利用均分原理,天枰左边放一部分硬币,右边放一部分硬币,还剩下一部分硬币。从平均情况考虑,三部分中含有假币的概率是相等的。因此,第一次称量中,我们可以将12枚硬币分成3份,每份4枚硬币,记为甲、乙、丙

    取甲、乙放到天枰上称量,一共会出现3种情况:

    • 平衡:说明甲乙中都不会含有假币,则假币一定在丙中,记丙中的4枚硬币为A、B、C、D。(依然不能将4枚硬币分成2份!无意义!!)取A、B放到天枰上称量,则又会出现三种不同情况:
      • AB平衡:AB不可能为假币,一定在C、D中。
        • 取C与A量,若平衡,说明D是假币;若不平衡,说明C是假币。
      • A重/B重:A为假或B为假。取甲中任意一枚(真币)与A称量。若平说明B为假币,且假币轻;若依然A重,说明A为假币且假币重;
    • 左倾:说明假币在甲或乙中。分别记甲中四枚硬币为ABCD,乙中四枚硬币为EFGH,丙中四枚硬币为IJKL(都是真币)。取ABE和CDI称量,则会出现
      • 若ABE与CDI平衡,则说明他们都是真币。FGH为假币且假币轻。取FG称量:
        • 若平衡,说明H为假币;
        • 否则FG中谁轻谁是假币。
      • 若左倾(即ABE重,CDI轻)。第一次称时,ABCD>EFGH。所以假币在AB中,且假币重;
        • A与I在称量一次,若平则B是假币,若A重,则A是假币。
      • 若右倾(即ABE轻,CDI重)。第一次称时,ABCD>EFGH。所以假币在CD中,且假币重;
        • C与I再称量一次,若平则D是假币,若C重,则C是假币。
    • 右倾:(与左倾情况完全对称)

        通过上面的分析可知,无论什么情况,3次称量就可以得出哪个是假币。

        理论分析:

    • 一次天枰称量能够得到左倾、右倾、平衡3种情况,如果把一次称量当做是一次编码,则它是3进制编码才能够表示;
    • 我们想要用3进制编码表示的是:12枚硬币,且假币的轻重未知。
      • 每枚硬币都可能是假币,共12种情况,假币有可能比真币轻,也有可能重,共12*2=24种情况;
      • 3n>=24 则n至少为3才可以。
    • 所以从信息论的角度讲,3次称量是最小值。
  • 相关阅读:
    Tarjan算法
    10JS数组
    9JS循环
    8.JS流程控制
    7.JS运算符
    6.JS方法
    5.JS变量的各种问题
    java封装遇到的问题
    js报Uncaught SyntaxError: Unexpected token <错误 解决方法:
    使用layui出现Uncaught ReferenceError: layui is not defined问题解决:
  • 原文地址:https://www.cnblogs.com/little-YTMM/p/5455072.html
Copyright © 2011-2022 走看看