西西河

主题:【原创】从两个经典智力趣题谈起(一) -- 丁坎

共:💬102 🌺203
全看分页树展 · 主题 跟帖
家园 三次称12/13个球的方法

基本思路

实现方法

这里举个实例,三次称12/13个球的方法

首先编号,编号过程冗长无聊,大家完全可以跳到最后面看结果(ctrl+f查找“好了现在开始称”)。

第一步把0-26用三进制表示出来:

decimal ternary

0 000

1 001

2 002

3 010

4 011

5 012

6 020

7 021

8 022

9 100

10 101

11 102

12 110

13 111

14 112

15 120

16 121

17 122

18 200

19 201

20 202

21 210

22 211

23 212

24 220

25 221

26 222

在把其中互补的放在一块

#1 #2

000 222

001 221

002 220

010 212

011 211

012 210

020 202

021 201

022 200

100 122

101 121

102 120

110 112

111 111

调整一下编号1和编号2,除了000/222以外,让4个小球编号1的每一位上是0的数目和是2的数目相等。我用的方法是,先把编号中1的个数小于2的小球花插着标上0或1, 再让不为1的每一位除以2和它异或:

switch? #1 #2 1 2 3

0 001 221 0 0

1 002 220 1 1 0

0 010 212 0 0

x 011 211 x

1 012 210 1 0

0 020 202 0 1 0

1 021 201 1 0

0 022 200 0 1 1

1 100 122 1 1

x 101 121 x

0 102 120 0 1

x 110 112 x

剩下的3个x就等于它所在的列里1的个数被4减:

switch? #1 #2 1 2 3

0 001 221 0 0

1 002 220 1 1 0

0 010 212 0 0

1 011 211 0

1 012 210 1 0

0 020 202 0 1 0

1 021 201 1 0

0 022 200 0 1 1

1 100 122 1 1

0 101 121 0

0 102 120 0 1

1 110 112 1

如果一个小球被标为1,那么把它的编号1和编号2互换:

#1 #2

001 221

220 002

010 212

211 011

210 012

020 202

201 021

022 200

122 100

101 121

102 120

112 110

终于,我们用它给小球编号

#1 #2

1 001 221

2 220 002

3 010 212

4 211 011

5 210 012

6 020 202

7 201 021

8 022 200

9 122 100

a 101 121

b 102 120

c 112 110

好了现在开始称,每次称的时候,把所有编号1中第i位是0的放在左边,第i位是2的放在右边:

第一次称, 1368在左边,2457在右边

第二次称, 17ab在左边,2689在右边

第三次称, 2356在左边,89bc在右边

每次称完,如果左边重,记作0,右边重,记作2,一样重,记作1。称n此后得到的数字就是有问题小球的编号。如果是编号1,这个小球比其他小球重。如果是编号2,这个小球比其他小球轻。如果得到的数字是111,那么有问题的是从来没有称过的小球,也就是第13颗小球,但是我们不知道它轻还是重。

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河