12个球,有一个和其他重量不一样,一个天平三次称出是哪一个并得出轻重

如题

一开始想到的一个想法,,最坏情况下是4次,后来看到的一个3次的想法

4次的:

考虑4个球的话,拿出其中两个,称一下

如果相等,坏球就是剩下的那俩里了,再称一次就行

所以4个球需要两次就可以了

考虑12个球分成三堆,一堆4个

拿出两堆,称一下,如果相等,说明在剩下的那一堆里,然后称两次就出来了(3次)

如果不相等,把其中一堆分成两小堆(一小堆两个),称一下,

相等说明不在这一大堆里,而是在另一堆里

然后再称两次得出来(4次)

不相等,确定在当前堆里,还是再称两次(4次)

 

3次的:

为了方便标一下号(大于10了,我写成16进制吧)

1234——5678——9abc

同样的分成三堆,选两堆(为了方便这里选前两堆)称一下

相等的话和上面一样(3次),不相等的话(为了方便,假设1234轻一些(无妨,设1234轻))

那么,如果球是轻的话,一定在1234里,否则(重)在5678里

那么、把12345678分一下,拿出6个来

我们称一下1235649abc,如果相等了

说明坏球在78里,称一下就好(3次)

12356轻了,说明,球在123里,称一下(称一下1和2,相等是3,不等轻的就是(已经知道是轻的球了))得出(3次)

为啥不是在49abc里呢,因为只有4可能是轻的,如果是4的话应该是49abc轻才对

12356沉了,那就是56里,称一下(3次)

同理

 

 

 

 

 

 

 

 

 

 

  • 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、付费专栏及课程。

余额充值