12个小球,1个小球与其他的质量不同,如何称最少次判断是哪个小球?
在n个外观完全相同的小球中,有一个与其它球重量不同。如何只用一架天平找到这个球并判断它比其它球轻还是重?最少需要称几次?
这是一个流传极广的经典问题,在网上随便一搜就会发现无数人都提出了自己的见解和算法并争论不休。最常见的是12个小球,至于更多球的计算,就不是人力能及的了。
实际上,这个问题确实是有准确答案的:n次称量最多可以在个球中找到不同的球,并判断它的轻重。
理论证明可参考The Problem of the Pennies, F. J. Dyson, The Mathematical Gazette , Vol. 30, No. 291 (Oct., 1946), pp. 231-234。
不过这里不打算讲那么多理论,而是直接演示怎么称量并找到这个小球。
算法十分精巧,我尽可能简单地描述了一下。如果还是觉得太抽象,没关系,直接点击这里或者拉到下面看演示就可以了。
- 编码:
知道了球数,就能算出需要称量几次,这里假设需要称n次;
以这个n次作为长度,使用0、1、2排列组合进行编码,如001021、212022等等,再去掉全0、全1和全2,可知一共有个编码;
如果在一个编码中,第一处相邻数字不同的情况是01、12或20,则我们称它为正序码,如1120021;
否则为逆序码,如2221012;
在长度为n的编码中,正序码和逆序码的数量相等,均为个。
- 赋值:
如果把一个正序码中的0换成1,1换成2,2换成0,则它仍然是正序码;
根据这个原理,我们把所有正序码按3个3个进行分组,如12001、20112、01220这3个就是一组,每一个都是按照原理变换得到的下一个正序码;
把正序码一组一组地分配给小球,每球一个,直到分完;
然后把每个正序码的0换成2,2换成0,它就变成了一个逆序码,如12001变成10221;
这样,每个小球就有了两个编码,一个正序,一个逆序,而且所有球都不重复。 - 称重:
第一轮,我们把所有正序码第一位为0的小球放在天平左侧,为2的小球放在右侧,其它的放在旁边;
如果天平左倾,记为0;右倾,记为2;平衡,记为1;
然后是第二轮,把第二位为0的小球放在左侧,为2的放在右侧,同样记下称量结果;
每一轮都按这个顺序进行,一共要称n次,最终结果是个n位的编码;
如果编码等于某个小球的正序码,则这个小球比其它球重;
如果编码等于某个小球的逆序码,则这个小球比其它球轻。
下面就是这个算法的完整演示:
//请查看后面的原文地址。
首先输入球数,电脑会自动给所有球编码;然后手工设置某个特殊球是轻还是重;接下来就会自动分组称量,最终找到特殊球,看看是否和你所设置的那个一致。
在本演示中,绿色代表轻;红色代表重。
补充说明:
- 如果小球的数量是3的倍数,则上面的算法完全没有问题,但如果不是3的倍数,则要做如下处理:
小球数量除以3,余1,则给多出来的这个球分配以1开头的编号;
小球数量除以3,余2,则给多出来的这两个球分配一组编号中以0和2开头的两个。
这样的话,第一轮称重的天平左右两侧球数必然相同。
而且每一轮称重后,都会有1/3或2/3的球被证明是重量正常的。所以如果后面出现天平左右球数不等,就找一个正常球补到少的一边,或者从多的一边取走一个正常球即可。 - 此算法适用于大于3的任何球数,限于浏览器性能,最多可输入999个;
- 本演示程序参考了知乎问题有999个乒乓球其中有一个和其他的质量不同,问你用天平最少几次一定能称出来?答案中洪涛提供的文章和陳浩的算法解释,在此特别致谢。
原文地址:http://www.funnyjs.com/ballweight/
12个小球,1个小球与其他的质量不同,如何称最少次判断是哪个小球?相关推荐
- c语言中编程称量十二个小球的质量,c语言题:现有十二个小球,其中一个小球的重量与其... 有12个外观相同的小球,其中11个是标准球,质量完......
导航:网站首页 > c语言题:现有十二个小球,其中一个小球的重量与其... 有12个外观相同的小球,其中11个是标准球,质量完... c语言题:现有十二个小球,其中一个小球的重量与其... 有1 ...
- 称球问题|信息量|拓展|C++代码实现|12大小一样的球,找出其中质量不一样的球解析和代码实现
直接求解法 条件:天平.12个一样的球,其中一个不一样,用天平找出那个不一样的球并确定轻还是重,最少的次数是:3 将12个球分为三组 A:1 2 3 4 B:5 6 7 8 C:9 10 11 12 ...
- 称球问题:12个球,有一个和其它的质量不一样,有一个天平可用,怎样找出它并说明它是轻是重
这算是一道智力题了. 一共12个球,有轻有重,所以一共有24种情况:天平每次有左倾.右倾和平衡三种情况,每次处理1/3,三次处理到1/27,所以无论怎样,三次称重一定可以得到结果. 先看看这个图: 下 ...
- 12【C语言 趣味算法】存钱问题(四层for循环,if判断)
Contents 一.Review 二.New Problem:The problem of saving money(存钱问题) 2.1 Description of the problem 2.2 ...
- CCF201803-2 碰撞的小球
试题编号: 201803-2 试题名称: 碰撞的小球 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有n个不计体 ...
- CCF201803-2 碰撞的小球(100分)【模拟】
试题编号: 201803-2 试题名称: 碰撞的小球 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有 ...
- 关于对小球相互碰撞处理的研究
由于要写一个模拟多个小球相互碰撞的程序,所以我就研究了下两个小球相互碰撞之后的速度变化规律(理想环境下无摩擦无碰撞损耗等的完全弹性碰撞). 我们都知道,两个小球如果是在同一条直线上相向而行,则我们可以 ...
- 7个相同小球4个不同盒子_如何用天平称三次找出12个外观相同小球中仅有的一个次品?次品质量与正品不同。...
刷知乎看到这个问题: 12个相同的小球其中有一个质量不同,一个天平,称三次找出这个小球,请问怎么称?www.zhihu.com 为了给出通俗易理解的答案,写了这个文章,祝题主有情人终成眷属! 先祭出 ...
- 问题:现有12个外形相同的小球,只有其中一个小球质量不同(不能确定较重还是较轻),请用天平找出是哪个小球不同,而且还要找出究竟是轻是重?条件:只能称三次
FindBall public class FindBall {public void compValue(double[] item){double GroupA = 0, GroupB = 0,G ...
最新文章
- 单页面抓图并且保存的爬虫
- iOS--viewController
- VueRouter导航守卫
- c++ 编译时检测结构体大小的的宏定义写法
- ODP.NET 之 ExecuteNoQuery 执行 Merge into 返回值
- Windows Tomcat 内存溢出解决方法
- krc转换lrc java_win7将酷狗音乐krc歌词转换成lrc歌词文件的方法
- kotlin 开发桌面应用_2020-21年Kotlin应用开发十大公司
- 基于android的影音设计,基于Android的车载影音导航系统软件设计与实现
- miui patchrom项目开发详细教程(Being updated)
- TeamTalk源码分析之win-client
- Source Insight 使用
- python数据分析之pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
- 360浏览器(QQ浏览器 等双核浏览器) 极速 IE 兼容 模式的 兼容问题处理:设置优先使用极速模式 渲染和加载
- app互斥登录,只能登录一个.
- 中小网站如何使用谷歌Adsence国际化优势赚钱?
- iPhone完整截屏
- Anaconda和pycharm
- 2017京东前端校招面试
- OpenStack T版 搭建【全网最全】