映射是一个很简单很实用的数学技巧,用得好经常能达到清晰明了的效果。
其中,映射到整数是经常用到的。
映射简单的离散量比较平凡,如果映射能结合序列可以做到很不一般的效果。
比如最近做过的一道题目:1000瓶水,其中一瓶有毒,小白鼠喝了一个星期死亡,要多少只小白鼠才能在一个星期内找到这瓶水?
思路一、1000瓶水映射到小白鼠,大概就要1000个吧,死哪个老鼠,自然知道是哪一瓶水。
思路二、以上映射做得很基础,得到的答案虽然是对的,但答案比题目要求的要多很多信息。题目要求知道那一瓶水有毒,需要知道的是一瓶的情况,而不是1000瓶的状态是有毒还是没毒的。这里面没有充分利用“只有一瓶有毒”这个信息。
要知道哪一瓶有毒,关键是如何识别这个瓶号,瓶号映射到小白鼠的状态之下便可。
小白鼠的状态只有两种:一种是喝了这瓶水,一种是没有喝这瓶水;即0或者1. 那么解题的思路就是将1000映射到0,1这个状态之上,单个0,1当然无法表示1000这么大的数,因此就需要组合一个0,1序列,就类似二进制编码的方式。状态单元是2,k个状态单元可表示的数是2^K 。2^10=1024 > 1000, 因此只需要K>=10便能映射0~1000的不同编码。也就是只需要10个小老鼠。
例:
矿泉水瓶1,2,3,4,5,6,7,8,
老鼠A:01010101
老鼠B: 00110011
老鼠C: 00001111
0表示不喝,1表示喝,将老鼠ABC对应的数字连起来会发现这个编码是独一无二的,也就是任何一瓶有毒,会死掉的老鼠的组合都是不同的,也许死一只,也许死两只,也许一只不死,总之必然不同。根据老鼠死掉的情况,翻查这个表格就能知道是哪瓶有毒了。因此,也就是达到映射的效果。
要点总结:
一、找到关联点,老鼠喝水,中毒死亡
二、是否找唯一性,如1000瓶中的一瓶
三、状态单元是什么?老鼠喝水,和没喝水
四、如何组合状态单元?这里关联唯一性用进制编码的方式颇为有效。
题目二:有27个铁球中有一个比较轻,用天平3次找出这个球,有什么方法?
思路一、一次排除一半可能是大多数人想到的第一种方式。
思路二、一次可排除2/3。首先分成3部分,称重,如果相同,自然剩下那一组;如果不同,自然是轻的那一组。
思路三、在称一次后,铁球有三种状态,要么是可能轻的,要么是可能重的,要么是标准球(平凡球)。
000000000111111111222222222
其中0是轻的,1是重的,2是标准的,这道题1也是标准的。以上是第一轮的可能结果。
称A:000000000111111111222222222
称B:000111222000111222000111222
称C:012012012012012012012012012
以上是三次称了之后的典型结果(其他结果必然不比这个要难,即可以变形到这个结果或者比这个结果要容易)。
首轮是将27个分三份称,做好标记(0,1,2),第二轮是将这三份每一小份再分三小份,不同组各取一份放一边,各取另一份放另一边称。第三轮依此类推,继续将每一小份分三份,结合这三次的每个球的编码都是不同的。这有什么用?说明每一个球都已经和称的结果一一对应起来了,特殊球必然也被唯一的结果所对应。
问题哪个结果才是对应特殊球的?因为每个球的编码都是不同,也就是任意一个球的称重都是确定的,要么是标准球,要么就是重球(也是标准球)。而一个轻球不会变成一个重球,一个重球也不会变成一个轻球,那些变动的数码,说明了它不是不是特殊球,而是被特殊球影响到称重结果的标准球(如特殊球在同一边导致它变轻,在另一边导致它变重)。始终不变的球只有两个,000和111。根据题意,轻的是我们要找的特殊球。
要点总结:
一、题目提到“3”是解题的突破点,为何3次就能解决这个问题?27/3=9/3=3=1,自然而然就会联想起把球和称重结果对应起来。
题目三:有12个球中有一坏球和其他球不一致,用天枰3次找出这个球,有什么方法?
称A:000011112222
构造:02220011,011
称B: 00001111
构造:0122,1
称C: 1100
称A的结果需要导入标准球2,构造成三部分00,011,011,任意一部分都能一次称完得到结果。
02220011称得到0001111得到数码不变的011这个结果(其中一个,其他类似)。
然后导入标准球构造成两部分,01,1。
0122称得到1100.即1是最终的结果,是重球。