有数量为n的硬币,和一个天平,已知其中有一个假币,且假币比真币轻,请找出这枚假币。
把硬币两半分,假币就在轻的一堆,然后不断的分成均匀的两堆,最后总能找出假币。
解题思路
采用三分法称重。
-
将 nn 个硬币分为三组:A、B、C,保证 A 和 B 的硬币数相同,且 A 与 C 的硬币数最多相差一个。
-
先将 A 和 B 放在天平两端称重,根据结果判断假币所在组:
- 若 A < B,说明假币在 A 中(较轻);
- 若 A > B,说明假币在 B 中;
- 若 A = B,说明假币在 C 中。
-
每次称重后,要么找到假币(当某组只剩一枚硬币),要么问题规模缩小为约 n/3n/3。
-
因此,最多称重次数为 C(n)=⌈log3n⌉C(n)=⌈log3n⌉。
示例
以 n=101n=101 为例的称重过程:
-
第一次称重:
将 101 枚硬币分为 A34、B34、C33(A、B 各 34 枚,C 为 33 枚)。
称 A34 与 B34:- 若 A < B,假币在 A34 中;
- 若 A > B,假币在 B34 中;
- 若 A = B,假币在 C33 中。
由此确定假币在哪一份中。
-
第二次称重:
假设假币在 A34 中,将 A34 再分为三份:AA11、BA11、CA12(AA 与 BA 各 11 枚,CA 为 12 枚)。
称 AA11 与 BA11:- 若 AA < BA,假币在 AA11 中;
- 若 AA > BA,假币在 BA11 中;
- 若 AA = BA,假币在 CA12 中。
确定假币在哪一份中。
-
第三次称重:
假设假币在 AA11 中,将 AA11 再分为三份:AAA4、BAA4、CAA3(AAA 与 BAA 各 4 枚,CAA 为 3 枚)。
称 AAA4 与 BAA4,确定假币在哪一份中。 -
第四次称重:
假设假币在 AAA4 中,将 AAA4 再分为三份:AAAA1、BAAA1、CAAA2(AAAA 与 BAAA 各 1 枚,CAAA 为 2 枚)。
称 AAAA1 与 BAAA1:- 若不等,轻者为假币;
- 若相等,假币在 CAAA2 中。
-
第五次称重:
若假币在 CAAA2(2 枚硬币)中,只需称其中一枚与一枚已知真币,即可确定哪一枚是假币。