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

最佳答案
12个球分成3组,每组4个 
第一步,拿两组出来称。4:4如果平衡的话,不标准的就在另外的那组4个。 
第二步从那组中,拿出2个球,和两个标准的球上天平称,如果平衡,就在剩下的2个球。 
第三步,那两个球拿出一个和标准的称。平衡的话,不标准的就是剩下的那个,不平衡的话,就是上秤的这个。 
回到第二步,如果不平衡,不标准的球就是在上秤的这两个里面,重复第三步。从两个球里找,不标准的。 
现在讨论4:4不平衡的情况,剩下的一组那4个都是标准的,一会要用这些标准的球参考。 
第一步,4:4不平衡 
第二步,从较重的那组拿出3个球,放到一边。再把较轻的一组拿出3个放到较重的那组。现在较轻的那组剩一个可能较轻(不标准)或者标准(因为不知道不标准的是较轻还是较重)的球。拿三个标准的球放到较轻这端。会出现3种情况,1,天平保持原样,2平衡,3,天平高低反过来。 
第三步,从第二步的结果入手, 
1,第二步结果如果天平保持原样,那说明从较轻拿到较重的那三个球和新拿进去的标准的那三个球重量一样,所以不标准的球是较重组被拿出三个球后剩下那个和较轻组被拿出三个球后剩下那个,2个球里找一个,用一个标准球一称就知道了。 
2,第二步结果如果天平平衡,说明这8个球都是标准的,那不标准的就是拿出去一边的那三个球。因为那三个球是在较重的一边拿出去的,可以推出质量不一样的球是较重的,3个球里面找一个较重的球,一步就出来了。 
3,如果天平高低反过来,原来较轻的一段剩下的那个是可能较轻的标准的球,现在较轻的一端变成较重,说明剩下的那个是标准的球。同理较重一端剩下的那个也是标准的球。(因为他原来较重,现在较轻了,如果他不标准,那他就是重于标准的球,那天平不会发生变化反过来。)说明不标准的那个球在较轻一端拿到较重一端的那三个球里面,因为这三个球在本来较轻的那一端,说明不标准的球比标准球轻,3个球里找一个较轻的球,一步就好了。
至于13个的情况,就跟12个类似了,第一次分组4、4、5,如果4、4不平则同12个球的情况计算,若4、4平则异常球在5个球中,结下来的方法就是从这5个球中任取3个同三个标准球(4、4两组已经确定为标准球)比,若轻了,则剩下一部即可在三个球中找出轻者,若重了,则剩下一部也可在这3个球中找出重者,若平了,则异常球在5球中剩余的2者中,剩下一步比较也足以断定那个是异常球。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值