代码改变世界

脑力风暴之小毛驴历险记(1)----好多胡萝卜(上)

2012-08-15 00:45  立雪三尺  阅读(717)  评论(1编辑  收藏  举报

     听说有好多胡萝卜 

    ---------------

     从前有一头叫做哈斯卡的小毛驴,它勤劳而善良,快乐又聪明.有一天小毛驴听说一千公里外的兔子国胡萝卜绝收了.心地善良的哈斯卡决定将自己今年收获的胡萝卜捐给兔子国.由于不信任红十字会,所以它决定亲自穿过一千公里的沙漠,将自己的三千根胡萝卜驮运到兔子国去.可是小毛驴也是驴,也要吃东西,每走一公里就不得不吃掉一根胡萝卜,而且它还是个孩子,每次最多就能驮一千根胡萝卜,怎样才能将自己的胡萝卜最多的留给兔子们呢?

    首先,小驴不可能带1000胡萝卜直接奔向兔子国,这样到最后不仅一个胡萝卜没带过去,没运送的2000胡萝卜也会在没人的角落默默晒成萝卜干.

    其次,小驴不可能拿出个小棒棒身手一挥,于是奥特曼附体,一下驼起3000胡萝卜,并且一口气走了1000公里,因为这里是天朝不是日本.

    然后,小驴也不可能投箸于席,奋袂而起,半日行军一千里.

    最后,小驴更不会装傻卖萌:"啥是胡萝卜啊?"

    于是,哈斯卡现在陷入了思考。
  

    小毛驴的爆发

   --------------

    小学时候曾经遇到过这样的数学题:

    AB两人分别从甲乙两地同时出发相向而行,甲乙距离为L,而AB两个人的速度为X1,X2,出发时,甲旁边有一条小狗以大于X1,X2的速度X3向乙跑去,遇到乙时候迅速返回再向甲跑去,遇到甲再折回跑向乙,如此反复,问: 甲乙两人相遇时,小狗一共跑了多少距离? 初一看觉得这个问题貌似非常复杂,其实解决这个问题的关键在不要纠结于每次小狗折回奔跑的距离的变化,而要抓住实质性的东西,即: 小狗恒定的速度和奔跑时间.

    小驴运胡萝卜的问题和上面这个问题有异曲同工之妙,小驴每公里吃一根胡萝卜,所以小驴最终剩下的胡萝卜其实取决于小驴走的路程,所以这个问题其实要求的是有限定条件下的最短路径.这个限定条件毫无疑问就回到了胡萝卜身上。

    再回到胡萝卜的问题上来,小驴每次最多驼1000的胡萝卜,每走1km消耗1根胡萝卜,要想活下命来,它每次走的距离都应在1000根胡萝卜的消耗内,由于出发时候胡萝卜总量大于1000,所以小驴必须走到一个距离出发点为X的地方折回搬剩下的胡萝卜,由此我们得到第一个条件:

      2X<1000km        (a)

 

   显然(a)这个条件是远远不够解决问题的,一共3000根胡萝卜,求的这个问题的关键就在于意识到,既然求最小消耗,就在第一个1000根胡萝卜消耗完的时候第一次最优策略:即完成对3000根胡萝卜的第一次搬迁.让我们对小驴消耗第一个1000根胡萝卜这个过程仔细分析一下:

    1:  小驴出发时候先拖1000根胡萝卜到X点,消耗X根胡萝卜,X点剩余1000-X
    2.   小驴带X根胡萝卜返回出发点, X点剩余1000-2x
    3.   小驴驼1000胡萝卜到X点,消耗X根, X点剩余2000-3X
    4.   小驴带X根胡萝卜返回出发点,X点剩余2000-4X
    5.   小驴驼1000胡萝卜到X点,消耗X根, X点剩余3000-5X.

    由于是在消耗第一个1000根胡萝卜的时候到达X点,即最后剩余应为2000胡萝卜,所以有:

    5X=1000  -->X=200  即小驴应第一次在距离出发点200km的地方停留.
 
   然后小驴从X点继续出发,由于剩余2000根胡萝卜,小驴不能一次驼完,所以与过程以相似,只不过这次小驴只需要两次就可以驼完,假设第二次停留点为Y点:

       1.小驴第一次出发驼1000胡萝卜到Y点,消耗Y根胡萝卜,Y点剩余1000-Y胡萝卜,
       2.小驴第一次返回X点,Y点剩余1000-2Y胡萝卜
       3.小驴第二次出发驼1000胡萝卜,到达Y点,消耗Y根胡萝卜,最后Y点剩余2000-3Y胡萝卜
     
     和过程一相似,此时有等式 3Y=1000, 即:Y=333.3
 
     此时小驴恰好还剩1000胡萝卜,而距离目的地兔子国还有1000-200-333.3=466.3km
     所以这次小驴 可以一次性的驼过去,最后达到兔子国的时候还剩下(1000-466.3)=534根胡萝卜(是否取整取决于小毛驴的胡萝卜是在每开始新的一公里时候吃还是结束新的一公里时候吃,这里取整。)
 

    新的开始 

   --------------

       
     小驴l略为一爆发,困惑到此就已经结束.它成功将最大量的胡萝卜送到了兔子国,收到了兔子国国王的奖励,小驴对子兴奋异常,关于这个奖励我们下次再谈.
     功臣小驴在兔子国四处溜达,不巧遇到了一只叫做程序猿的猴子,程序猿普普通通,不求闻达,快快乐乐的生活着,当然除却偶尔的加班到天亮的悲催。由于小毛驴很高兴,也希望猴子跟着一块分享它的快乐,于是给它讲了它是如何运送胡萝卜的.猴子听后叶惊奇不已,却不料,忽然小驴挠了挠头,一拍大腿,撂了撂蹄子,对猴子喊:
     "HI,大猴子,你不是程序猿嘛,你能用你的程序解决我的难题么?"
     程序猿作为工业革命的新物种,人类科技研究上的一种重新演变,并且拥有无与伦比的耐力、超越时代的智商、横穿社会的苦逼相和低于人类平均寿命的优良特点,听到这个顿时也很感兴趣:“不过今天确实有点晚了,又到了睡觉时间了,明天抽空再来我的方式解决这个问题吧”
     小驴打了打哈欠说:"那就明天吧,今天我也困了,要好好休息了,明天我还要去拿奖励呢"
     猴子连忙问:"国王奖励你了什么啊?"
     小驴四周瞧了瞧,招呼猴子凑过来,然后悄悄在猴子的耳边说:"保密!"
      这你丫的!

    

View Code