一、总共有3000只香蕉,有一只骆驼每一次只能带1000只香蕉,每1公里吃1只香蕉,没有香蕉吃它是不肯走的,A-B 点距离1000公里,如果这个骆驼要从A点到B点有什么办法可以让更多的香蕉剩下来?如何做到?如何最有效率的运最多的香蕉到B点。
如果不考虑实际的约束(驴的疲劳和时间)而光是理论上计算的话!既然要剩最多那就走的次数要少.先拿1000只走到667里处(C点)放下回到A点!再拿1000只走到666里处(D点)回去A点,再背剩下的1000只到D点拿那334只,现在身上就有668只了,再到C点拿那333只身上就正好1000只了(D点到C点路上吃一只),一直走到B点就行了!最后剩667只香蕉!
-----------百度的------------
恩恩,是这个逻辑。
代码可不可以帖出来啊。
@记住了: 这不是到逻辑题吗?还需要用代码解决?
@与阳光握手言和: 是啊,昨天面试这个题目没有做出来。郁闷啊
回去也是要吃香蕉的吧?
扯蛋。
我想问的是。回去吃不吃香蕉?
来回3000,够吃么?哈哈,肯定不吃啊
这逻辑不合理吧,回去不吃香蕉怎么走
回去没驼东西啊
@陈红: 题目不是每走一公里就吃一根香蕉啊
@北辰炎斌: 那肯定是针对驼着东西的情况说的,不严谨
@陈红: 不可能不严谨,出这题应该是知道答案的
@北辰炎斌: 我再研究研究,大哥
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根)
--------------百度
大哥好厉害
百度被你 搬完了
3000只香蕉,1000公里的路从A----->B,要运过去,至少是吃1000只香蕉的;
那么剩下的两千只香蕉怎么运才能剩的最多呢,当然是驮着香蕉走的次数最少是最好的,每次最多能驼1000只,至少得驼两次;
所以我们按照两次算,不可能驮到终点,那就吃没了,而且最后那次驼的一千只就已经有了前两次没走完的路需要吃的香蕉了,而且三次走到同一距离,应该正好剩1000只香蕉才行(还是不能忘每次只能驼1000只),所以就是1000除以3嘛,最后决定我们在中间找的两个点,分别是666,667!
①骆驼先载上1000个香蕉 走到某一处,然后放一些香蕉在路上某处。
再带上一些香蕉 边走边吃返回到起点
②重复上述过程,直到还剩余香蕉全部都搬运到路上某处.
③最后重复①②过程
一开始,有3000个香蕉 那么在通往终点的方向上的同一段路 要走3次
该段路程反方向要走2次
如果只剩了2000个香蕉 那么在通往终点的方向上的同一段路 要走2次
该段路程反方向要走1次
很显然 可以用剩余香蕉的数量来分隔。
从3000个香蕉到刚好剩余2000个香蕉
消耗了1000个香蕉(骆驼行走路程为1000m)
在同一段路要走3+2=5 次
那么这段路只有 1000/5=200m 此时走过200m 剩余2000个香蕉
从2000个香蕉到1000个
又消耗了1000个香蕉(骆驼行走路程为1000m)
根据上述推论 在在同一段路要走1+2=3 次
那么又走过1000/3=333.3m
最后剩余1000个
距离终点只有1000-200-333.3=466.7m
那么只用消耗467个香蕉
最后剩余1000-467=533个香蕉
/**
* 取得剩余香蕉最大值<br>
* @param total 香蕉总数
* @param max 每次最多运输数量
* @param distance 总路程
* @since
*/
private static void getMax(int total,int max,int distance){
int remainT = total;//剩余香蕉总数
int remainD = distance;//剩余总路程
int pos = 0;
int cycle = (remainT / max) * 2 -1;
while(cycle > 1){
pos = max / cycle;
remainD-=pos;
remainT = remainT - pos * cycle;
System.err.println("剩余公里:" + remainD + "剩余香蕉:" + remainT);
cycle = (remainT / max) * 2 -1;
}
System.err.println("最终剩余香蕉:" + (max - remainD));
}
这应该是一个递归算法。
相当于用运20运油,但运20本身也要耗油。而运送距离可能刚好消耗完所有的运送燃油。需要找最优算法。
我有一个算法,可能不是最优,但至少是一个。
1.先拿1000个直到400m处回来,来回共消耗800个,所以运送了200个到400m处。
2.再拿1000个直到400m处回来,来回共消耗800个,所以又运送了200个到400m处。
3.拿1000个直到400m处回来,只去不回消耗400个,所以运送了600个到400m处。
4.400m处现在一共有1000个,一次运到终点,消耗600个,剩余400个。
看来这运输机还是越大越好呀,要是一次能运3000个,功耗即使再大点,起码也可以剩下1000个以上。