12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球!

12个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。
13个呢?(注意此题并未说明那个球的重量是轻是重,所以需要仔细考虑)
需要用到铅笔....

答案:
首先将12个球分成3堆,4+4+4,将两堆放到天平上,第一次称,可能结果:a:平衡,b:不平衡:   
   
a:平衡情况: 在余下的未称过的4个里,取其中的三个将2个放在天平的一边,假设放在左边,一个放在右边,第一次平衡的那些球我们可以知道它是正常的,我们称它为标准球,取一个标准球,放在一个的天平一边,用铅笔打个记号,表示他正常,第二次结果有以下几个:平衡a1,不平衡a2。  
    a1:显然在唯一一个未称过的那个球,这种情况无法知道它是轻还是重;这是找到了,而且只用到了两次称天平。  
    a2:如果不平衡,我们可以将下沉的那边的除去标准球外的球标上+,轻的那个标上-号,结果无非在+、+、-、或-、-、+三个球中,取其中的一个+、-放在天平的一端,取第一次的8个标准球的两个,放在另一端,如果标准球重,显然我们加“-”的那个球即为找的那个球,如果标准球那端轻,说明我们“+”的球即为找的那个球,不管哪个方法都找到了那个坏球。达到目的了。共用到了三次机会。   
接下来来解决b不平衡情况:  
Node:平衡情况way2:成3堆,标记为A,B,C,4(A)+4(B)+4(C),(若4A球=4B球,则A、B为标准球。)(1次)
A球取两个与C球取两个称,情况有两种:A1:平衡,A2:不平衡。(2次)
若A1:则问题在C的剩下的两个球中,取剩下的两个球中。取剩下的球中的一个与标准球称,若平衡,最后一个没有称的球就是我们要找的球,若不平衡,则这个球就是我们找的球;
若A2:问题球在这两个球中,取其中一个与标准球称,若平衡,另一个球就是我们要找的球,若不平衡,则这个球就是我们找的球;
    b:不平衡情况:   
      我们可以假设下沉那端可能重,上浮那端可能轻,我们在这里可以用上面一样的方法,用铅笔标上在球上标上+号代表可能重,-号代表可能轻的球。我们在这里假设左边下沉,显然未称过的4个球没有问题,我们可以称其为标准球。然后我们取5个可能不正常的球,假设取3个+号的球,2个-号的球,接下来第二次称重,将“+、+、-”组合放在天平一端,“-、+”放在另一端,在这一端我们添上一个标准球,这样可以组成3和3的来称,注意到我们将原来的一个“+”球和“-”球交换了,++-还放在左端,-+和正常的球放在右边,结果有以下几种情况:
b21:如果平衡结果不变,说明问题球在左边的++和右边的-里;  
b22:如果不平衡情况交换了,说明球在我们交换的两个球里;
b23:如果球平衡,说明问题球在没参加天平称重的“+、-、-”三个球中;   
下面处理b1、b2、b3情况:   
   b21:如果平衡结果不变,说明问题球在左边的++和右边的-里,接下来有一次机会找出三个球的,取其中的+-放到天平左端,取标准球2个放在天平的右端,如果左端下沉,说明我们假设+的那个球是要找的球,如果左端上浮,说明我们左端那个-号的是要找的球,如果平衡的,剩下的那个未参加第三次平衡的那个+号球是要找的球。 
    b22:如果不平衡情况交换了,说明问题球在我们交换的两个球“+、-”里,我们可以用一次机会确定,很容易,将他们放在天平左端,利用标准球放在右边,若左边重,则“+”球要找的球,若左边轻,则“-”球要找的球;  
    b23:如果球平衡,说明问题球在没参加天平称重的面的“+、-、-”三个球中。接下来的要做的事是如何用仅有的一次机会去确定三个球假设为+--中找到那个是坏球,这时可以利用b21中的做法:取其中的+-放到天平左端,取标准球2个放在天平的右端,如果左端下沉,说明我们假设+的那个球是要找的球,如果左端上浮,说明我们左端那个-号的是要找的球,如果平衡的,剩下的那个未参加第三次平衡的那个+号球是要找的球。 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个题可以用天平分治法来解决,具体步骤如下: 1. 将铅分成三组,每组放在天平两端进行量,找出重量较轻的一组。 2. 将较轻的一组铅继续分成三组,每组放在天平两端进行量,找出重量较轻的一组。 3. 将重量较轻的那组铅继续分成三组,每组放在天平两端进行量,找出重量较轻的一组。 4. 在剩下的那组铅中就只有一个了,它就是三次量中被出来的轻的那个铅。 下面是用 C 语言实这个算法的代码: ```c #include <stdio.h> int findFakeBall(int balls[], int start, int end) { if (start >= end) { return start; } int groupSize = (end - start + 1) / 3; int left = start, right = end; while (left < right) { int mid = (left + right) / 2; int sumLeft = 0, sumRight = 0; for (int i = left; i <= mid; i++) { sumLeft += balls[i]; } for (int i = mid + 1; i <= right; i++) { sumRight += balls[i]; } if (sumLeft < sumRight) { right = mid; } else { left = mid + 1; } } return findFakeBall(balls, start + groupSize, start + groupSize * 2 - 1); } int main() { int balls[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 0}; int fakeBallIndex = findFakeBall(balls, 0, 9); printf("The fake ball is at index %d.\n", fakeBallIndex); return 0; } ``` 在这个代码中,findFakeBall 函数接收一个整型数组和两个整数参数 start 和 end,表示要在数组的 start 到 end 范围内查找假的索引。函数首先计算出每组铅的大小 groupSize,然后不断进行二分查找,将铅分成左右两组,并且计算出它们的重量。如果左侧的铅更轻,则继续在左侧进行查找;否则继续在右侧进行查找。最终,当只剩下一个时,它就是假的索引。 在上面的代码中,我们假定假重量是 0,而其他铅重量是 1。这样,我们只需要比较铅的数量,而不需要比较它们的重量。实际上,我们也可以假定假重量是任何一个不同于其他铅的值,然后通过比较重量找到

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值