zoukankan      html  css  js  c++  java
  • 和数位有关的几个问题(称重等)

    映射是一个很简单很实用的数学技巧,用得好经常能达到清晰明了的效果。

    其中,映射到整数是经常用到的。

    映射简单的离散量比较平凡,如果映射能结合序列可以做到很不一般的效果。

    比如最近做过的一道题目: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是最终的结果,是重球。

  • 相关阅读:
    2013年个人总结
    ASP.NET Core SignalR (一):SignalR 概述
    ASP.NET Core 中的配置 【上】
    .NET Core 服务器
    .NET Web 宿主(Web Host)【下】
    .NET Web 宿主(Web Host)【上】
    .NET 通用主机(Generic Host)
    ASP.NET Core中间件
    ASP.NET Core中的依赖注入【下】
    ASP.NET Core中的依赖注入【上】
  • 原文地址:https://www.cnblogs.com/Nobel/p/3006552.html
Copyright © 2011-2022 走看看