zoukankan      html  css  js  c++  java
  • 分金条

    一、一个经典的问题:
    你让工人为你工作 7 天,给工人的回报是一根金条。金条平分成相连的 7 段,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何给你的工人付费?

    二、思路:
    1. 金条是可以找钱的,如工人有一段金条,付当天工钱时可以用2段去换工人的一段,不能说工人拿到金条了马上拿去花了,那就没得玩了
    2. 金条只允许弄断2次,也就是说最后只有3段金条
    3. 因为工人每天拿到的工钱是递增的,也就是说工人会依次拿到 1, 2, 3 ... 7段金条
    4. 因此,这个问题可以转化为:如何用3个数进行组合后,可以得到 1, 2, 3 ... 7,而且这3个数其中的任何一个在某一天可能在我这里,也可能在工人哪里,如果我们用1表示某个数在我这里,用0表示不在我这里,根据数理逻辑,这刚好就是一个二进制数表达的问题:
    这3个数就是:
    1 1 1
    我们发现3位的二进制可以表达的数字是 0 ~ 111,也就是0 ~ 7,刚好满足题目的要求,那么接下去就简单了,3位二进制的每一个位即表示一段金条的长度,该位为1,表示此段金条在我这里,为0表示则付给工人了。
    那3位对应的二进制数就是:1, 2, 4
    支付方法刚好就是一个真值表:
    第一天:110, 给工人1段的金条
    第二天:101, 给工人2段的金条,拿回1段金条
    第三天:100, 1段和2段的金条都给工人
    第四天:011, 给工人4段的金条,拿回1段和2段的金条
    第五天:010, 再给工人1段的金条
    第六天:001, 给工人2段的金条,拿回1段金条
    第七天:000, 金条就都给工人了

    三、扩展
    弄清楚这个问题的本质后,我们再往前扩展一下,如增加一个位,就会变成1111,可以表达0~15,那么题目同样可以换为一个工人为你工作15天,金条只能分4段,问该怎么分?如果看清楚了上面的思路的朋友,我相信应该很快就能解答出来。

  • 相关阅读:
    JDBI
    Concise: Compressed ’n’ Composable Integer Set
    java 7 新特性
    BIO的简单Demo
    手写一个死锁Demo
    实现一个Cglib代理Demo
    实现一个JDK代理demo
    ClassNotFoundException和 NoClassDefFoundError区别验证
    集合—ArrayList
    Hadoop之Storm基础
  • 原文地址:https://www.cnblogs.com/organic/p/5689896.html
Copyright © 2011-2022 走看看