小球称重问题~通过三次称重找出十二个小球质量不一样的小球,并判断小球轻重

小球称重问题

一、问题描述

十二个小球进行称重,只能称三次,找出不一样的小球,并判断异球的轻重。

二、问题分析

将12个小球分成三组,将小球分别标号为1到12,分组情况如下:

  A组小球:1,2,3,4;

  B组小球:5,6,7,8;

  C组小球:9,10,11,12

情况分析:每个小球都有两种可能,一共会有24种判断结果。

三、算法分析

第一次,先将1-4号放在左边,5-8号放在右边。
  1.如果右重则坏球在1-8号。
    第二次将2-4号拿掉,将6-8号从右边移到左边,把9-11号放
    在右边。就是说,把1,6,7,8放在左边,5,9,10,11放在右边。
      1.如果右重则坏球在没有被触动的1,5号。如果是1号,
       则它比标准球轻;如果是5号,则它比标准球重。
        第三次将1号放在左边,2号放在右边。
          1.如果右重则1号是坏球且比标准球轻;
          2.如果平衡则5号是坏球且比标准球重;
          3.这次不可能左重。
      2.如果平衡则坏球在被拿掉的2-4号,且比标准球轻。
        第三次将2号放在左边,3号放在右边。
          1.如果右重则2号是坏球且比标准球轻;
          2.如果平衡则4号是坏球且比标准球轻;
          3.如果左重则3号是坏球且比标准球轻。
      3.如果左重则坏球在拿到左边的6-8号,且比标准球重。
        第三次将6号放在左边,7号放在右边。
          1.如果右重则7号是坏球且比标准球重;
          2.如果平衡则8号是坏球且比标准球重;
          3.如果左重则6号是坏球且比标准球重。
  2.如果天平平衡,则坏球在9-12号。
    第二次将1-3号放在左边,9-11号放在右边。
      1.如果右重则坏球在9-11号且坏球较重。
        第三次将9号放在左边,10号放在右边。
          1.如果右重则10号是坏球且比标准球重;
          2.如果平衡则11号是坏球且比标准球重;
          3.如果左重则9号是坏球且比标准球重。
      2.如果平衡则坏球为12号。
        第三次将1号放在左边,12号放在右边。
          1.如果右重则12号是坏球且比标准球重;
          2.这次不可能平衡;
          3.如果左重则12号是坏球且比标准球轻。
      3.如果左重则坏球在9-11号且坏球较轻。
        第三次将9号放在左边,10号放在右边。
          1.如果右重则9号是坏球且比标准球轻;
          2.如果平衡则11号是坏球且比标准球轻;
          3.如果左重则10号是坏球且比标准球轻。
  3.如果左重则坏球在1-8号。
    第二次将2-4号拿掉,将6-8号从右边移到左边,把9-11号放
    在右边。就是说,把1,6,7,8放在左边,5,9,10,11放在右边。
      1.如果右重则坏球在拿到左边的6-8号,且比标准球轻。
        第三次将6号放在左边,7号放在右边。
          1.如果右重则6号是坏球且比标准球轻;
          2.如果平衡则8号是坏球且比标准球轻;
          3.如果左重则7号是坏球且比标准球轻。
      2.如果平衡则坏球在被拿掉的2-4号,且比标准球重。
        第三次将2号放在左边,3号放在右边。
          1.如果右重则3号是坏球且比标准球重;
          2.如果平衡则4号是坏球且比标准球重;
          3.如果左重则2号是坏球且比标准球重。
      3.如果左重则坏球在没有被触动的1,5号。如果是1号,
       则它比标准球重;如果是5号,则它比标准球轻。
        第三次将1号放在左边,2号放在右边。
          1.这次不可能右重。
          2.如果平衡则5号是坏球且比标准球轻;
          3.如果左重则1号是坏球且比标准球重;

四、核心代码

 1 def find(balls):
 2     #1.2.3.4球和5.6.7.8球进行称重比较
 3     result = weight(balls[:4], balls[4: 8])
 4     if result==RIGHT:
 5         result=weight([balls[0],balls[5],balls[6],balls[7]],[balls[4],balls[8],balls[9],balls[10]])
 6         if result==RIGHT:
 7             result=weight(balls[0],balls[1])
 8             if result==RIGHT:
 9                 return 0,‘第1号球重‘
10             elif result==EQUAL:
11                 return 4,‘第5号球轻‘
12         elif result==EQUAL:
13             result=weight(balls[1],balls[2])
14             if result==RIGHT:
15                 return 1,‘第2号球重‘
16             elif result==EQUAL:
17                 return 3,‘第4号球重‘
18             elif result==LEFT:
19                 return 2,‘第3号球重‘
20         elif result==LEFT:
21             result=weight(balls[5],balls[6])
22             if result==RIGHT:
23                 return 6,‘第7号球轻‘
24             elif result==EQUAL:
25                 return 7,‘第8号球轻‘
26             elif result==LEFT:
27                 return 5,‘第6号球轻‘
28     elif result==EQUAL:
29         result = weight(balls[:3], balls[8: 11])
30         if result==RIGHT:
31             result=weight(balls[8],balls[9])
32             if result==RIGHT:
33                 return 9,‘第10号球重‘
34             elif result==EQUAL:
35                 return 10,‘第11号球重‘
36             elif result==LEFT:
37                 return 8,‘第9号球轻‘
38         elif result==EQUAL:
39             result=weight(balls[0],balls[11])
40             if result==RIGHT:
41                 return 11,‘第12号球轻‘
42             elif result==LEFT:
43                 return 11,‘第12号球重‘
44         elif result==LEFT:
45             result=weight(balls[8],balls[9])
46             if result==RIGHT:
47                 return 8,‘第9号球重‘
48             elif result==EQUAL:
49                 return 10,‘第11号球重‘
50             elif result==LEFT:
51                 return 9,‘第10号球重‘
52     elif result==LEFT:
53         result = weight([balls[0], balls[5], balls[6], balls[7]], [balls[4], balls[8], balls[9], balls[10]])
54         if result==RIGHT:
55             result=weight(balls[5],balls[6])
56             if result==RIGHT:
57                 return 5,‘第6号球重‘
58             elif result==EQUAL:
59                 return 7,‘第8号球重‘
60             elif result==LEFT:
61                 return 6,‘第7号球重‘
62         elif result==EQUAL:
63             result=weight(balls[1],balls[2])
64             if result==RIGHT:
65                 return 2,‘第3号球轻‘
66             elif result==EQUAL:
67                 return 3,‘第4号球轻‘
68             elif result==LEFT:
69                 return 1,‘第2号球轻‘
70         elif result==LEFT:
71             result=weight(balls[0],balls[1])
72             if result==EQUAL:
73                 return 4,‘第5号球重‘
74             elif result==LEFT:
75                 return 0,‘第1号球轻‘

五、总结

思考:12个小球需要称三次找出坏球,那若有更多的小球的小球需要称多少次才能找出坏球呢?

原文地址:https://www.cnblogs.com/cyt99/p/12341087.html

时间: 2024-08-28 09:25:57

小球称重问题~通过三次称重找出十二个小球质量不一样的小球,并判断小球轻重的相关文章

输入三个整数,找出最大值

/* ============================================================================ Name : max.c Author : duanqibo Version : Copyright : Your copyright notice Description : 输入三个整数,找出最大值 ====================================================================

[Effective Java 读书笔记] 第三章类和接口 第二十-二十一条

第二十条 用函数对象表示策略 函数指针(JAVA的函数指针,是指使用对象的引用来作为参数,传递给另一个对象的方法)主要用来实现策略模式,为了在JAVA中实现这种模式,要申明一个接口来表示该策略,并为每个具体策略申明一个实现了该接口的类. 如果这个策略只被执行一次,使用匿名类,如果重复使用,则通常实现为私有的静态成员类,并通过共有的静态final域导出(最后一个例子),其类型为该策略接口. 第二十一条 优先考虑静态成员类 嵌套类主要有四种:静态成员类,非静态成员类,匿名类,局部类 静态成员类,一般

[Effective Java 读书笔记] 第三章类和接口 第十二条

第十二条 使类和成员的可访问性最小化 总得来说,我们应该尽量将成员的访问范围限制到最小!有利于解耦,开发.测试和优化都能够更加独立. 对于成员(域,方法,嵌套类和嵌套接口),有四种可能的访问级别,访问范围从小到大: 1. private,只有声明成员的类的内部才能访问 2. 包级私有的,声明成员的类所在的包内的任何类都可以访问,如果成员不显示声明访问级别,就是这种级别,所以也成为缺省访问级别 3.protected,声明成员的类及其子类可以访问,并且声明类所在包中的任何类也可以访问 4.publ

三分钟教你学Git(十二) 之 fast-forward

什么是fast forward, 顾名思义,就是快速向前进,Git怎么做到快速的呢? 原来如果Git判定可以fast forward的时候,直接修改当前HEAD指针的指向然后再修改当前HEAD指针,说白了就是修改两个指针的指向,而并没有生成新的commit对象. 所以当你修改了其中的一个branch中的某个commit的时候,另一个branch如果也引用了此commit,则这个branch会很意外的出现变化,因为引用的是同一个commit对象. 所以一般有几种方法: 1 --no-ff 显示告诉

称3次,找出坏鸡蛋

有十二个鸡蛋,其中有一个是坏的(重量与其余鸡蛋不同),现要求用天平称三次,称出坏的那个鸡蛋 准备工作:将十二个鸡蛋编号,1.2.3......11.12.分为三组,1.2.3.4为第一组,5.6.7.8为第二组,9.10.11.12为第三组.其中,Time = ?表示这是第?次称. 分析:取第一组.第二组,分别放置在天平两端,两种情况:平衡,不平衡(Time = 1) ♦ if (平衡):这8个鸡蛋都是好的,取3个(1.2.3)出来,和剩下4个中的任意3个(假设是9.10.11),将这两组分别放

10个小球用天平找出重量不同的那个

上周被人出了一道算法题目,题目的内容是:有10个小球,外观一样,其中1个小球和其他9个小球重量不一样,请使用天平以最少的次数找出这个重量不一样的小球. 解题思路:其实这是一个很典型使用分治算法的例子,由于不知道这个特别的小球是比其他球重还是轻,所以我们不能简单的使用二分法去求解,所以我选择3为模. 解题步骤: 1.将10个球分成4个数组,分别是A[a1, a2, a3],B[b1, b2, b3], C[c1, c2, c3], D[d1]:假设这个重量不一样的球为n,其他普通球的任意一个是m:

R in action读书笔记(16)第十二章 重抽样与自助法之 置换检验

第十二章:重抽样与自助法 本章,我们将探究两种应用广泛的依据随机化思想的统计方法:置换检验和自助法 12.1 置换检验 置换检验,也称随机化检验或重随机化检验. 有两种处理条件的实验,十个受试者已经被随机分配到其中一种条件(A或B)中,相应的结果变量(score)也已经被记录.实验结果如下: 如果两种处理方式真的等价,那么分配给观测得分的标签(A处理或B处理)便是任意的.为检验两种处理方式的差异,我们可遵循如下步骤: (1) 与参数方法类似,计算观测数据的t统计量,称为t0: (2) 将10个得

毛泽东时代是中国历史上最伟大的时代——为纪念伟大领袖毛主席逝世三十二周年而作

http://www.wyzxsx.com/Article/Class22/200810/53093.html 毛泽东时代是中国历史上最伟大的时代--为纪念伟大领袖毛主席逝世三十二周年而作 94岁老红军郑加平 在去毛化,非毛化的鼓噪声中,其中最恶毒的是有人公开叫嚣:"建国以来毛泽东没干过一件好事".说这样话的人,不用分析,可以断言,他是替被推翻的帝国主义,封建主义,官僚资本主义的余孽发出的嚎叫! 怎样评价毛泽东,稍有理智的人都知道,应把毛泽东放在人类思想大师的高层次中加以研究,从这一观

十二银元分三次找一假

思考题· 有12块银元,其中有一块是假的.真假银元从外观上看完全相同,但假银元的重量与真银元略有不同. - 求证,用一架天平称3次即可找出假银元,并指导假银元是轻是重: - 给出一种称量方法. 证: 1.将12块银元拆分为4个一组,分为3组. 2.第一次称量:将其中两组放到天平上. 2.1.如果这两组重量一致,那么假银元在剩下的一组中,本次称重的银元均为真银元. 2.1.1.第二次称重:从该组中取出3个银元与3个真银元进行称量 2.1.1.1.如果重量不一致,那么取出的3个银元中有一个是假银元,