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

该文详细阐述了一种在13个球中找出唯一一个重量不同的坏球的方法。通过分组比较,首先确定坏球可能存在的范围,然后逐步缩小范围,利用天平的平衡原理判断坏球的重量属性。在每一步中,都强调了记录重量信息的重要性,以减少判断次数。整个过程逻辑严谨,旨在最大化效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

13个球中,我们将重量与其他球不同的球称之为“坏球”,讲普通球称之为“好球”。
先将球随机分成4-4-5三组,然后让前两组(4-4)进行对比

1、4-4平

则证明前两组的8个球都是好球,坏球在第三组的五个球中。
从第三组的五个球中任意拿出三个球,放在天平左盘;再取三个好球放在天平右盘(3-3)。

  • 1a、3-3平

则这六个球都是好球,坏球在最后的两个球中。
再拿一个好球与剩下两个的任意一个比,就可找到坏球。

  • 1b、3-3不平

则坏球在这三个球中。
这时要记录含有坏球这一组的轻重信息,可以推测出坏球的质量是比好球重还是轻
如果左盘(含有坏球)比右盘(全是好球)重,则坏球比好球重;反之则坏球轻。
假设坏球比好球重
这三个球中任意拿出两个进行比较
如果平,则剩下的一个是坏球
如果不平,则重的一方是坏球。

2、4-4不平

则第三组的五个球都是好球。坏球在前两组的八个中。
这是又要记录重量信息。
现在给重的一边的四个球编号为ABCD,轻的一边编号为1234
取AB1放天平左边,CD2放天平右边(3-3)进行比较

  • 2a、3-3平

则只剩下3号和4号球可能为坏球,而且坏球重量比好球轻。
让这两个球进行比较,谁轻谁是坏球。

  • 2b、3-3不平

假设左盘重,右盘轻。
则有两种情况:
1、AB中有一个是偏重的坏球
2、2是偏轻的坏球

因此这时只需让A与B相比较

2b(1)、不平

则谁重谁是坏球

2b(2)、

则2号是坏球

总结:
本题必须记录很关键的重量信息(判断坏球是重还是轻),否则至少需要四次才能找到坏球。

### 常见程序员面试智力题及答案解析 #### 题目一:两个父亲,两个儿子 题描述:有三个人站在一起,其中两人被为父亲,另外两人被为儿子。请这三人分别是什么关系? 解释:这个题考察的是逻辑思维能力以及对家庭成员间多重身份的理解。 - 这三人的具体关系是祖父、父亲儿子。父亲既是儿子的父亲也是祖父的儿子[^1]。 #### 题目二:烧绳计时 题描述:有一根不均匀的绳子,从头燃烧到尾总共需要一个小时。如何利用这样的两根绳子来测量出45分钟的时间呢? 解答过程: 1. 同时点燃第一根绳子两端与第二根绳子的一端; 2. 当第一根绳子完全燃尽时正好过去了半小时;此时立刻点燃第二根绳子另一端; 3. 待第二根绳子也全部烧完,则总耗时即为所求的45分钟。 此方法巧妙运用了双端同时燃烧缩短时间长度原理[^2]。 #### 题目三:天平找次品 题描述:有9个外观相同的体,其中一个重量稍轻于其他八个正常在提供一台可以比较两边质量差异的传统托盘天平,请最少几次能找出那个较轻的小? 解法思路: 通过分组对比的方式逐步缩小范围直至定位目标物。首次可将九颗珠分成数量相等的三个小组(每组3),任选其二置于秤上进行第一次测试。如果平衡则说明异常存在于未被选取的那一份里;反之不平衡的话就锁定在下沉方之外的那个部分内。接着再把可疑对象单独拿出来做第二次衡量便能够精准确定哪个才是特殊个体了。 因此理论上仅需两次操作就能完成任务。 ```java // Java code to demonstrate the logic of finding lighter ball using divide and conquer approach. public class BallWeight { public static void main(String[] args){ int balls[] = {1, 1, 1, 1, 1, 1, 1, 0.9, 1}; // Assume one is slightly less than others System.out.println("The lightest ball index: " + findLighterBall(balls)); } private static int findLighterBall(int[] weights) { return helper(weights, 0, weights.length - 1); } private static int helper(double[] w, int start, int end) { if (start >= end) return start; int mid = (end + start)/2; double sumLeft = getSum(w, start, mid); double sumRight = getSum(w, mid+1, end); if(sumLeft != sumRight && Math.abs(end-start)<=2){ return sumLeft<sumRight?mid:end; }else{ return sumLeft < sumRight ? helper(w,start,mid):helper(w,mid+1,end); } } private static double getSum(double[] array,int from ,int to){ double result=0; for(;from<=to;from++){ result+=array[from]; } return result; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值