27个砝码中,只有一个与其他26个砝码重量不同且不知该砝码是轻还是重,问最少需要称多少次能找到该砝码

一. 首先,遇到这种题目,第一反应就是二分,对半称,再对半称,所以有方法一:

  1. 先取出一个,剩余26个对半称(第1次),此时最优情况可能就出现了,刚好取出的那个砝码就是重量不一样的砝码(下文直接用特殊砝码代替重量不一样的砝码),于是13对13就平衡了。
  2. 如果取出的砝码(记为 i )是普通砝码,就继续往下称。
    假设刚才分的两堆分别为A(13)与B(13),则将A(13)中取出一个砝码,记为 j ,剩下的12个砝码,对半称(第2次),分别记为 Aa’(6) 与 Ab’(6),同时对B(13)做同样处理,取出的砝码记为 k ,对半称(第3次)的两堆分别为 Ba’(6) 和 Bb’(6),此时有个特殊情况,就是刚好从堆 A(13) 与 B(13) 中取出的两个砝码中有一个是特殊砝码。这样就直接在已经取出的 i,j,k 三个砝码中来找出特殊砝码,因为经过 1 中步骤,已经知道 i 是普通砝码,则只需将 i 与 j、k 中任意一个砝码称一次(第4次),假设 i 与 j 称,如果平衡,则 k 是特殊砝码,如果不平衡,则 j 是特殊砝码,这样就一共称了4次,这还是在第二次对半称时出现最优的情况,如果 j 与 k 都不是特殊砝码,则还需要称更多次。

二. 实际上在解决这种不知道砝码是轻还是重的问题时,三分更好。

将27个砝码分为3堆,每堆9个,分别记为A(9)、B(9)、C(9)。

  1. 最优情况
    • 将A(9)与B(9)比较,此时平衡,则C(9)中包含特殊砝码。
    • 将C(9)均分成3堆,每堆3个,分别记为Ca’(3)、Cb’(3)、Cc’(3),将Ca’(3)与Cb’(3)比较,此时平衡,则Cc’(3)中包含特殊砝码。
    • 将Cc’(3)中的3个砝码分别记为 i、j、k ,将 i 与 j 比较,此时平衡,则 k 为特殊砝码。这就是三分解的最优情况,称了3次。
  2. 普通情况
    • A(9)与B(9)比较,此时不平衡(第1次),然后将A(9)与B(9)中任意一堆与C(9)比较(第2次),假设A(9)与C(9)比较,如果平衡,则B(9)中包含特殊砝码,如果不平衡,则A(9)中包含特殊砝码,并且此时我们知道特殊砝码到底是轻还是重了
    • 假设经过上一步,得到A(9)中包含特殊砝码,且特殊砝码比普通砝码重。
    • 此时如果对A(9)采用方法一中的方法,取出一个砝码,然后4对4比较,且取出的砝码即为特殊砝码,这样也只称3次,但如果取出的砝码不是特殊砝码,则需要继续二分下去,共需要称5次。
    • 如果继续三分,则将A(9)三分为 Aa’(3)、Ab’(3)、Ac’(3),将 Aa’(3) 与 Ab’(3) 比较(第3次),如果平衡,则 Ac’(3) 包含特殊砝码,如果不平衡,则重的一堆中包含特殊砝码(基于上面的假设)。
    • 假设 Aa’(3) 中包含特殊砝码,其中的三个砝码分别为 i、j、k,任意比较两个砝码,即可得到特殊砝码(第4次)。总共称了4次。

这类型问题一般采用分治的思想解决,但知道轻重与不知道轻重的解决方法是有区别的,除去特殊情况,知道轻重,最少两个比较对象就可以解决问题,不知道轻重,则至少需要3个比较对象来解决。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个著名的数学题,为“砝码题”或“题”。解决这个题的一种常见方法是使用二进制。具体来说,我们将每个砝码重量表示为 $2^k$ 的形式,其 $k$ 是一个非负整数。这样,我们就可以用二进制表示任何小于等于 $N$ 的正整数的重量。 例如,如果 $N=13$,我们可以用 $2^0=1$、$2^2=4$ 和 $2^3=8$ 这三个砝码出任何小于等于 $13$ 的正整数的重量。具体来说,我们可以按照以下步骤进行: 1. 将 $13$ 放在天平的左边,不放任何砝码在右边。 2. 将 $8$ 放在天平的右边,左边剩余 $5$。 3. 将 $4$ 放在天平的左边,右边剩余 $4$。 4. 将 $4$ 放在天平的右边,左边和右边的重量相等,出了 $9$ 的重量。 5. 将 $1$ 放在天平的左边,右边剩余 $3$。 6. 将 $1$ 放在天平的右边,左边和右边的重量相等,出了 $10$ 的重量。 7. 将 $1$ 放在天平的右边,左边剩余 $2$。 8. 将 $1$ 放在天平的左边,右边剩余 $1$。 9. 将 $1$ 放在天平的右边,左边和右边的重量相等,出了 $11$ 的重量。 10. 将 $1$ 放在天平的右边,左边剩余 $0$。 11. 左右两边的重量相等,出了 $13$ 的重量。 因此,对于 $N=13$,最少需要 $3$ 个砝码。 以下是用Java代码实现砝码题的方法: ```java import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int N = in.nextInt(); int ans = 0; while (N > 0) { if (N % 2 == 1) ans++; N >>= 1; } System.out.println(ans); } } ``` 该代码首先读入 $N$,然后使用位运算计算出 $N$ 的二进制表示 $1$ 的个数,即为所需的砝码数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值