直接求解法
条件:天平、12个一样的球,其中一个不一样,用天平找出那个不一样的球并确定轻还是重,最少的次数是:3

将12个球分为三组
A:1 2 3 4
B:5 6 7 8
C:9 10 11 12

第一次称A组和B组

(1)若平衡:说明C组不正常:

第二次称C组中任意三个如:9 10 11和任意前三个

**(1.1)**若平衡则是C组中剩余那个12不平衡。
第三次称12与其他任意一个称,12在上则12轻,否则12重。

**(1.2)**若不平衡:说明 C组中被称的三个不正常;12正常,且根据倾斜可以判断不一样的球是重还是轻!
第三次称将C组中被称的三个再取两个称一下
若平衡则剩下那个不一样
若不平衡,则根据倾斜判断是哪个球!

(2)若不平衡:说明A和B组中的前八个不平衡
此时有斜率可以帮助判断后面

第二次称C组中任意三个如:9 10 11搭配B组中的8和5 6 7 4称、
组成E D称
(2.1) 若ED平衡说明A组中1 2 3不一样
第三次称1 2 3任意两个称
若一样,则剩下那个不一样(根据第一次称A组上下判断轻重,若A下则不一样的球重否则轻)
若不一样,(根据第一次称A组上下判断轻重,若A下则此组中下的球重否则轻)

(2.2) 若ED不平衡说明D中的5 6 7 4和E组中的8不一样
若AB倾斜与DE倾斜一样说明4和8不一样
第三次称 4和8中任意一个与另一个称,若平衡,则另外一个不一样根据选取得到球和剩下的那个球最初位于AB组和倾斜可判断轻重

若AB倾斜与DE倾斜不一样说明4和8不影响结果
影响的是5 6 7
在使这三个中两个称:
因为此种情况是B组不一样,根据B倾斜来判断轻重。
如上可以判断出是哪个。

—————————————————————————————

用信息论解释:
参考: http://blog.sciencenet.cn/blog-677221-669159.html.
里面大佬讲的超级详细!

信息量的公式:

H=∑-pi log pi

如果计算中的对数log是以2为底的,那么计算出来的信息就以比特(bit)为单位。
根据香农的信息概念,信息能消除不确定性,而我们在解决数学题的时候,也是要消除不确定性,得到确定的答案。并不仅仅是老鼠问题和称球问题如此,我认为大多数问题都多少是一个‘消除不确定性’ 的过程。因此,我们为何不借用香农的工具,研究研究我们的问题有多少不确定性呢?也就是说,需要多少信息量才能解决这个问题?另外,根据题目所限制的手段,最多能够得到多少信息量?有无可能完全解决这个问题?等等。

对于此问题:
12个球都不知轻重,那么每一个球都有轻/重之分,12个球就有24种可能
且未称之前这些球的轻重的概率都一样1/24
运用公式:要确定出这些球的信息量为:log24

对于秤来说:
每称一次其结果为:相等 左重右轻 左轻右重
其以上概率为1/3
秤能提供的信息量为log3

我们要做的是用称去求解球的信息
可以理解为秤的信息量要能得到球的信息量
即:称的次数*秤的信息量>=球的信息量
x * log3>=log24
所以x的最小值为3
—————————————————————————————
拓展
称球问题是说,用天平称k次,在n个球中找出唯一的一个重量不标准的次品球来,n最大是多少?如何找?有关这个次品球的说法,通常有3种变形:

1.已知次品球是更轻(或更重);

2.不知次品球的轻重,找出它并确定轻重;

3.不知次品球的轻重。

利用信息熵的概念,可计算出这3种情形下n的最大值,并且帮助思考构成算法的过程:

1.已知次品球是更轻(或更重),这时n的最大值 = 3**k;

2.不知次品球的轻重,找出它并确定轻重,这时n的最大值 = (3**k-3)/2;

3、不知次品球的轻重,这时n的最大值 = (3**k-1)/2。

还有老鼠药的问题等

用信息熵求解更快!
—————————————————————————————
代码实现

#include<iostream>
#include<time.h>
#include <stdlib.h>
using namespace std;
typedef int Status;//每次随机产生12个球的重量,11个相同,1个不同
//每次打乱顺序,并显示出来
//调用dif_Ball函数能找到12个球中不一样的那个球的位置,并表示轻重及大小!Status find_difBall(int *arr,int num_)
{int A, B, C;int t;//分组t = num_ / 3;A = B = C = 0;for (int i = 0; i < t; i++)//将12个球的质量分为3组,且能得知每组的质量!{A += arr[i];//前三个0-3B += arr[i + t];//4-7C += arr[i + 2 * t];//8-11}//首先先将AB分组秤 会有三种情况,A>B A<B A=Bif (A > B)//第一次秤A>B{//如果A>B,也就是不平衡,//将AB换元素A = (A - arr[0] - arr[1] - arr[2] + arr[4] + arr[5] + arr[6]);//新的一组为4 5 6 7B = (B-arr[4]-arr[5]-arr[6]+arr[8]+arr[9]+arr[10]);//新的一组为8 9 10 11if (A > B)//A>B第二次秤{//如果新的AB不平衡,则前三个球正常,剩下的4和8不正常if (arr[3] > arr[0])//取4号球与正常球相比 第三次秤cout << "4号球是重球,重量为:" << arr[3] << "g" << endl;//4号球与前两次秤都是重,说明不一样的球是4号球且质量大一些elsecout << "8号球是轻球,重量为:" << arr[7] << "g" << endl;//此时4号球只能是和正常球一样重,说明8号球是轻球}else if (A < B)//A<B说明5 6 7球有一个是轻球{if (arr[4] < arr[5])cout << "5号球是轻球,重量为:" << arr[4] << "g" << endl;else if(arr[4]>arr[5])cout<<"6号球是轻球,重量为:" << arr[5] << "g" << endl;elsecout << "7号球是轻球,重量为:" << arr[6] << "g" << endl;}else//A=B,说明1 2 3 号球中有质量不一样的球{if(arr[0]<arr[1])cout << "2号球是重球,重量为:" << arr[1] << "g" << endl;else if(arr[0]>arr[1])cout << "1号球是重球,重量为:" << arr[0] << "g" << endl;elsecout << "3号球是重球,重量为:" << arr[2] << "g" << endl;}}else if (A < B)//第一次秤A<B{//如果A<B,也就是不平衡,//将AB换元素A = (A - arr[0] - arr[1] - arr[2] + arr[4] + arr[5] + arr[6]);//新的一组为4 5 6 7B = (B - arr[4] - arr[5] - arr[6] + arr[8] + arr[9] + arr[10]);//新的一组为8 9 10 11if (A < B)//第二次秤A<B方向一致,球在4或8中{if (arr[3] < arr[0])cout << "4号球是轻球,重量为:" << arr[3] << "g" << endl;elsecout << "8号球是重球,重量为:" << arr[7] << "g" << endl;}else if (A > B)//5 6 7不正常,且偏重{if(arr[4] > arr[6])cout << "5号球是重球,重量为:" << arr[4] << "g" << endl;else  if(arr[4]<arr[6])cout << "7号球是重球,重量为:" << arr[6] << "g" << endl;elsecout << "6号球是重球,重量为:" << arr[5] << "g" << endl;}else//123中有轻球{if (arr[0]<arr[1])cout << "1号球是轻球,重量为:" << arr[0] << "g" << endl;else if (arr[0]>arr[1])cout << "2号球是轻球,重量为:" << arr[1] << "g" << endl;elsecout << "3号球是轻球,重量为:" << arr[2] << "g" << endl;}}else//(A=B){int E, F;E = arr[8] + arr[9] + arr[10];F = arr[0]+arr[1]+arr[2];if (E > F)//重球{if (arr[9] > arr[8])cout << "10号球是重球,重量为:" << arr[9] << "g" << endl;else if(arr[9]<arr[8])cout << "9号球是重球,重量为:" << arr[8] << "g" << endl;elsecout << "11号球是重球,重量为:" << arr[10] << "g" << endl;}else if (E < F){if (arr[9] > arr[8])cout << "9号球是轻球,重量为:" << arr[8] << "g" << endl;else if (arr[9]<arr[8])cout << "10号球是轻球,重量为:" << arr[9] << "g" << endl;elsecout << "11号球是轻球,重量为:" << arr[10] << "g" << endl;}else{if(arr[11]>arr[0])cout << "12号球是重球,重量为:" << arr[11] << "g" << endl;elsecout << "12号球是轻球,重量为:" << arr[11] <<"g"<< endl;}}return 0;
}Status main()
{//int i;srand(time(NULL));//rand函数加上此可以每次产生不一样的值int Ball[12];int num = rand() % 99+ 1;//产生一个值在1-100之间的值,令数组所有元素都为该值。for (int i = 0; i < 12; i++){Ball[i] = num;}int a = rand() % 11 + 0;//产生一个0-11之间的值,并随机赋予数组0-11之中的元素Ball[a] = rand() % 99 + 1;if (Ball[a] == Ball[a + 1] && Ball[a] == Ball[a - 1])//如果其中一个值与另外的值相等,则重新来过{Ball[a] = rand() % 99 + 1;}cout << "显示所有球重量:" << endl;for (int i = 0; i < 12; i++)//产生之后在屏幕上显示出所有的元素{cout << Ball[i] << "g ";}cout << endl;cout << endl;cout << "找出那个不一样的球并显示其重量!" << endl;int dif_Ball = find_difBall(Ball, 12);//调用该函数找出不一样的值//cout << dif_Ball << "是不一样的那个球" << endl;return 0;}





称球问题|信息量|拓展|C++代码实现|12大小一样的球,找出其中质量不一样的球解析和代码实现相关推荐

  1. NLTK找出最频繁的名词标记的程序(代码详细解释)

    代码来自<Python自然语言处理>,我做了详细的代码解释. # -*- coding:utf-8 -*- import nltk def findtags(tag_prefix,tagg ...

  2. C语言 输入一行字符,统计其中有多少个单词 和 有三个字符串(网上找的代码有瑕疵已解决),找出其中最大者的完整代码及分析过程

    问题1:输入一行字符,统计其中有多少个单词 思考这一类问题的常用解决方法是什么?是这种形式的: ------>最终完整的代码:<------ #include <stdio.h> ...

  3. 找出连续最长数字串python_字符串中找出连续最长的数字字符串的实例代码

    //1. 写一个函数,它的原形是int continumax(char *outputstr,char *intputstr) //功能: //在字符串中找出连续最长的数字串,并把这个串的长度返回, ...

  4. 茶杯:N个杯子排成一排,第X个杯子藏有球,交换任意两个杯子K次后,找出藏球杯子位置。

    N个杯子排成一排,第X个杯子藏有球,交换任意两个杯子K次后,找出藏球杯子位置. (本文获得CSDN质量评分[92]) [学习的细节是欢悦的历程] Python 官网:https://www.pytho ...

  5. 面试智力题 - 找出12个球中质量不同的小球

    面试智力题 - 找出12个球中质量不同的小球 面试被问到了这么一道智力题. 现在有12个外观完全相同的12个小球,已知其中一个小球质量和其他的11个不同.用一个天平称3次,找出这个质量不同的小球,并说 ...

  6. 准确率99.9%!如何用深度学习最快找出放倒的那张X光胸片(代码+数据)

    医学图像数据的质量一直是个老大难题.难以清理的数据制约着许多深度学习的应用. 而实际上,深度学习本身就是清洗医疗数据的好帮手. 今天,我们就来讲一个案例,展示如何用深度学习迅速清洗一个杂乱的医疗图像数 ...

  7. 从12个球中找出唯一一个质量不同的球,并说明轻重

    前言 最近在刷腾讯的笔试题,遇到了这道智力题.春招实习生的时候,面试依图,也遇到了这个问题.今天就在这总结下解法. 问题描述 12个球,其中只有一个质量不同的球.要求使用一个天平,经过三次称量,找出这 ...

  8. (称重问题)假设你有8个球,其中一个略微重一些,但是找出这个球的惟一方法是将两个球放在天平上对比

    问题描述 假设你有8个球,其中一个略微重一些,但是找出这个球的惟一方法是将两个球放在天平上对比.最少要称多少次才能找出这个较重的球? 解答思路 至少要称2次 将8个球分成3份,其中2份每份有3个球,设 ...

  9. 小球称重的解法整合 N个小球有一个坏球,最少几次能找出坏球

    小球称重的解法整合 N个小球有一个坏球,最少几次能找出坏球     最近在看小球称重的问题,之前只记住了公式,最近回过来看,发现知乎上多了一些优质答案,遂记录一下. 现附上学习地址 先说结论, N 个 ...

最新文章

  1. Compose 手势事件:防止重复点击,双击,长按,全局触摸隐藏键盘
  2. php xmlhttp.responsetext,XMLHttpRequest中responseText怎么获取指定div的内容,而不是整个HTML的内容...
  3. Java基础(五)继承和多态
  4. 在Web中如何运用JavaScript实现打印功能
  5. Windows下搭建IOS开发环境(一)
  6. 交叉编译cross compiling
  7. 初识循环神经网络(RNN)
  8. feature tools:Python 中的自动化特征工程
  9. C语言基础入门实例汇总(共65个案例)
  10. Linux系统删除文件夹命令
  11. BI报表工具:IT人的必备工具!
  12. 如何让iframe背景色透明
  13. kprobe与perf probe使用简单记录
  14. Multiclass Weighted Loss for Instance Segmentation of Cluttered Cells
  15. CNN网络实现手写数字(MNIST)识别 代码分析
  16. 【转载】获得root权限(刷入magisk)
  17. 单片机读取obd_OBD_CAN读取代码(stm32f103)
  18. 奥塔在线:vsftpd服务如何开启访问日志
  19. oracle中timestamp怎么用,Oracle Timestamp类型
  20. 2021年中国货车行业现状及趋势分析:柴油货车产销双增长 [图]

热门文章

  1. CSS display(显示)详解 与 visibility(可见性)详解[第七天]
  2. HTML+JS+CSS+xml快速入门
  3. 相似变换Sim3详述
  4. 脉脉发布AI人才数据图鉴;『李沐·深度学习论文精读』视频合辑;CVPR 2022自动驾驶资源合集;线性代数图绘笔记;前沿论文 | ShowMeAI资讯日报
  5. 数字转字符串;字符串转数字
  6. OSI七层模型的功能及协议
  7. 列表(ListNode)
  8. 短时傅里叶变换(STFT)实例
  9. 技术周刊(第10期):新技术又来了?
  10. 人脸旋转对齐(opencv-python)