Wednesday, July 15, 2009

一道面试思考题

更多精彩请到 http://www.139ya.com


一道面试思考题

题目:

总共有3000只香蕉,有一只骆驼每一次只能带1000只香蕉,每1公里吃1只香蕉,没有香蕉吃它是不肯走的,A-B 点距离1000公里,如果这个骆驼要从A点到B点有什么办法可以让更多的香蕉剩下来?如何做到?如何最有效率的运最多的香蕉到B点?



已有的解答:

1、第一次带上1000根,走300公里后,放下400根,这样还剩300根,刚好能返回A点, 再带上1000根,再走到300公里处,放下400根....反复这样走三次, 这样300公里处能有1500根,然后重复上一种方法再走300公里,最后到终点后能生200根香蕉,当然'300'这个数可以设成未知数,列出方程,求出极值。



2、第一次的回头是必须的,但是如果还做第二次回头的话数量就减少啦,应该是第一次就走400公里,然后回头再装一次,第二次也是重复,每一次可以放下 200根香蕉,就是400根了。。然后第三次是不用回头的,装上1000根后走到400公里时还剩600根香蕉,就把原来剩下的400根给装上,刚好 1000根走完剩下的600公里,到了终点还剩400根,这样应该是最多的了。



3、尽量减少往返,在300米处放下400颗,往返3次,300米处此刻有1200颗,350米处放下500颗,往返两次,350米处有1000颗,一口气走到底,还剩350颗。



4、排除法,1000米设置一个回头点,是不可行的。1000米设置两个回头点A,B,也就是将1000米分成3段。设每段长度为从起点到A点X1,A点到B点X2,B点到终点X3,
X1+X2+X3=1000
在A点需要来回5次才能将3000的香蕉运到A点。那么A点有3000-5*X1的香蕉,
通过推理(细节省略),3000-5*X1小于等于2000,
这样到B点 3000-5*X1-3*X2,这个值小于等于1000,
终点剩下3000-5*X1-3*X2-X3,根据上面的判断,如果都取等于的话:
X1=200;X2=334
最终剩下532。



5、首先:0~200km 每往返2.5次,依次把所有的香蕉运动到下1公里,共消耗1000个,剩2000个,
其次:200~533km 每1km往返1.5次,依次把所有的香蕉运送到下1公里,共消耗999个,剩1001个,
最后:533~1000km,满载1000个香蕉去终点(留一个在533处),路上吃掉467个,还剩1000-467=533个。



6、分三个阶段,1、三次运2000个到200公里处;再用两次运1000个前进333公里;最后拿上1000个香蕉走完剩下的467公里,共节余533个。



7、第一次:带1000根香蕉走到250公里,留下500跟香蕉,返回吃完剩余的250根,走了500公里
第二次:再带1000根香蕉走到500公里处,留下250根香蕉,返回到250公里处从留在这里的500根中取250根,返回,走了1000公里
第三次,带上最后的1000根香蕉走到250公里处,带上这里的250根,继续走到500公里处再带上这里的250根,继续走剩余的500公里,最后剩余500根香蕉,走了1000公里
总计走了2500公里,剩余500根香蕉。



8、每次最多带1000根,所以2001到3000根之间需要跑5趟(加上两个回去的趟数),如果2000或以内的根数也跑5趟的话就不合算。2000及以内需要跑3趟,1000及以内需要跑1趟,所以第一次跑可以一口气跑200(3000-5*200=2000),如果跑的比200少也无所谓,多跑几次,一样的效果。第二次跑333(2000-3*333=1000)(多余的一根不要了)。第三次可以带上1000根只跑一趟。到终点可以剩下 1000-(1000-200-333)=533。



9、刚刚只考虑了来回走五遍,但没有考虑一次最多带1000根。就是说如果只有2000根,只要来回走3遍。
(1)带上1000根走到200公里处,放下600根,回到A点只剩0根;带上1000根走到200公里处,放下600根,回到A点只剩0根;再带上最后1000根走到200公里处,放下800根。在200公里处共有2000根。
(2)带上1000根从200公里处走到533公里处,放下334根,回到200公里处剩0根;带上最后1000根从200公里处走到533公里处,放下667根。现在在533公里处共有1001根,带上1000根,从533公里处走到B点,剩533根。



10、前面要尽量多带香蕉,后面到了只剩1000了就一直往前,这样消耗最少。前面多带时,设立回头点,其实是具体点不重要,只要不太大,每公里回一次和两公里回是基本一样的。就按每公里每公里的前进把香蕉多带,刚开始是每前进一公里把所有的都搬运要回头两次消耗5只香蕉,200公里后剩下2000,前进每公里只需要回头一次消耗3只,再前进333公里,就只剩下1001只(多了1只,我们应该在出发时就给骆驼),就再也不回头到最后,能搬运1000-533,就是467只。



11、我是这么想,先不管AB中间到底需要几个停留点才能得到最佳答案,最关键的一点是:
*********骆驼无论从哪个停留点出发,满载(或者越接近)跑到下一个停留点是效率最高的。而效率越高越能省下更多的香蕉*********
设, x = A至停留点1
1, 有3000根香蕉,就意味着在第一个停留点上骆驼必须跑三次(第三次不用返回)即,第停留点1的香蕉剩余值一定为:(1000-2x)*2 (1000-x)=3000-5x
2.1, 假设只有1个停留点,根据刚才说的,x=400的时候效率最高(因为在停留点1能剩下1000根),即在只有一个停留点的情况下,跑到终点可以剩下400根香蕉
假设有2个停留点, 并设y = 停留点1 至 停留点2
2.2, x=200效率最高,此时在停留点1能剩下2000根(即2000),这个时候问题就变成了2000根香蕉跑完800米。那在停留点2剩下的香蕉数就变成了:(1000-2y) (1000-y)=2000-3y
2.2.1, 按照从A点到停留点1的结论,y=333的时候效率最高,因为这个时候在停留点2剩下了1001根香蕉。(即带了1000根香蕉跑完467米,最终省下533根)

No comments: