首页 > 试题广场 >

一个猴子身带100个香蕉,他距离家50米。这个猴子要带香蕉回

[单选题]
一个猴子身带100个香蕉,他距离家50米。这个猴子要带香蕉回去,但是他一次最多只能背50个香蕉,而且,每走一米他就要吃掉一个香蕉(往 回走也要吃香蕉)。这个猴子最后最多可以带多少个香蕉到家?
  • 30
  • 25
  • 18
  • 16
推荐
D
问题化简为:猴子带50个香蕉走到x米处原路返回取走剩下50香蕉走到终点,问x取何值终点香蕉最多。
带50个走x米剩余(50-x)香蕉,放下(50-2x)香蕉在原地,携带x香蕉返回原点,x香蕉正好被路上消耗。带50香蕉走x米至前面放香蕉的地方,此时共有(100-3x)香蕉。
接下来能够携带的香蕉数为50与(100-3x)中的小者,两种情况走(50-x)米到达终点香蕉分别还剩x个以及(50-2x)个。
当50<(100-3x)时(x最大值为16)剩余x香蕉,应取x最大值即剩余16香蕉
编辑于 2015-02-03 11:44:19 回复(0)
分析:猴子必然要在半路某个地方停下来(假设这个地方离出发点x米),放下一部分香蕉并拿上x个香蕉返回出发点,拿上剩下的50个香蕉(这50个香蕉就是路程上要消耗的口粮,而在x米处剩下的香蕉就是能带回住处的香蕉个数),在这里可以列出一个方程式:(50-2x)+(50-x)<=50求得x=16即答案
等式解释:(50-2x)猴子第一次到x点抛去返回消耗香蕉剩余数量
                  (50-x)猴子第二次到x点剩余香蕉数量
                 这两个剩余量总和最接近50就是最优解
发表于 2017-09-01 18:58:20 回复(0)
这题的思路是这样的,由于一次只能最多只能背50个,总共100个,最少需要2次才能背完,而如果一次把50个背回家,因为距离是50m,离家49m的时候还有49个,48m的时候还有48个,以此类推,离家2m的时候还有两个,到家就没了,可以看到离家越近,背的其实越少,对于最大可以背50个的容量来说,这是一个比较大的浪费,所以可行解必然是先将50个运到中间的某个位置,然后回去将剩余的50个再运到这个位置,使得从这个位置再出发时的香蕉最好能达到50个,因为这样就可以在这个位置一次将50个香蕉运回家,设中间位置距离开始位置为 x ,中间位置距离家为 y ,则 x+y = 50,第一次将50个香蕉运到 x 位置,需要吃掉 x 个香蕉,然后回到出发位置又需要吃掉 x 个香蕉,然后将剩余的50个香蕉运到 x 位置,再吃掉 x 个香蕉,这个过程吃掉了 3x 个香蕉,前面说过,这个位置剩余的香蕉数最好是 50个,因为这样可以一次性将最多的香蕉运回家,所以按照剩余的香蕉数可以列方程 100 - 3x = 50 ,x = 50 / 3,向上取整 x = 17(如果不向上取整,那么运到 x 位置的香蕉总数会超过50个),则y = 50 -x = 33,在 x 处剩余的香蕉总数为100 - 3 * 17 = 49个,再走y = 33m,又要吃掉33个,到家就剩下49 - 33 = 16个了。
编辑于 2016-09-17 15:57:16 回复(0)
猴子每走一米吃一根香蕉,所以猴子吃了50根香蕉后,猴子只走了25米,因为需要回去将剩余香蕉带回,接下来就只有50根香蕉了,他可以一直带着香蕉走,还要走(50-25)=25米,也就是还要吃25根香蕉,所以最后到家剩余25根香蕉,我的想法是这样子的,不知道哪里出了问题,求大神解答>_<
发表于 2016-04-07 11:10:20 回复(10)
// 参数分别为:所有的香蕉,要运输距离,一次最大运输量,每一米吃的
function getMaxRest(total = 100, dis = 50, trans = 50, eat = 1) {
  if (total < dis * eat) {
    return 0
  }

  // 每个 while 循环代表前进 1m
  while (total > trans) {
    // 以每个 trans 为一个箱子划分(不够 trans 的也算一个),num 就代表你现在有几个箱子
    let num = Math.ceil(total / trans)

    // 当剩余的香蕉所组成的这个箱子,不够往返一次 1m 的时候,放弃这个箱子,因为运输这个箱子是亏本的
    if (total - (num - 1) * trans < eat * 2) {
      num--
    }

    // n 代表将所有的箱子运输 1 米需要吃多少,-1 是因为最后一个箱子不需要往返
    const n = 2 * num * eat - 1
    total -= n
    dis--
  }

  return total - dis * eat
}

发表于 2020-04-25 01:10:49 回复(0)
    /*
        我的思路就是先将五十个香蕉先运一米然后又回来拿剩下的香蕉,直到当香蕉的数量小于五十时,就可以不用再往回跑
    */
    public static void main(String[] args) {
        int hou = 100;//香蕉数量
        for (int i = 0; i < 50; i++) {//小于50是米数
            if(hou>50){
                hou = hou - 3;
            }else{
                hou = hou - 1;
            }
        }
        System.out.println(hou);
    }


编辑于 2019-10-09 09:45:01 回复(0)
背50个香蕉走17m,到17m处还剩33根。
带上17根回去(17m处放下33-17=16根)。
回到起点,正好把带着的吃完了。
再背上50根,走到17m处。身上有33根,补上16根,共49根。
走接下来的33m。最后49-33=16根。
发表于 2018-07-04 15:33:55 回复(1)
问题化简为  3*X>=50,X的最小值 17:;因为猴子拿不完香蕉时需要往返拿香蕉。 需要往返时,猴子每走一米(实际走了3米,向前走一次再回来一次再向前走一次)消耗3个香蕉;当走了17米时消耗了51个香蕉还剩49个可以一次拿走。
50-17=33;还剩33米。
49-33=16;消耗33个香蕉 还剩16个。

发表于 2016-07-06 21:56:10 回复(1)
感觉题目不够严谨,应该说每走一米必须吃一个香蕉。
容易误解为:没有带香蕉的时候不用吃。
发表于 2016-03-24 21:09:23 回复(0)
选D
解析:
猴子每往家走1米就停下来做一个判断:
    a、将香蕉放下,回头去拿之前没能带走的香蕉;
    b、继续往家的方向走;
那么猴子做选择的依据是:返回拿之前没能带走的香蕉所获得的收益必须大于或者等于返回路途中需要消耗的香蕉(等于的时候相当于多走点路多吃点香蕉,对吃货而言还是划得来的,最后带回家的香蕉数不会受到影响)。因为这里是走1米就判断一次,所以这里返回的消耗是2;也就是说只要每次没能带走的香蕉数大于等于2,那么回去拿都是值得的。
好了我们假设猴子第一次背着50个香蕉走到了1米处,此时在0米处(即起点)没能带走的香蕉是50个,远大于回去拿的成本数2,所以猴子果断的将身上的香蕉放下,留一个香蕉做路费返回到0米处将剩余的香蕉背到1米处,这个时候所有的香蕉都在1米处,因为0米到1米这段路猴子共走了三次,所以香蕉数共计为100-3=97。
以此类推:走了n米的时候剩下的香蕉数为100-3n;
那么这个时侯走到n+1米处,则留在n米处带不走的香蕉数是(每次最多带50个):100-3n-50=50-3n;
那么在n+1米处做上面的判断的时候就有50-3n>=2,即n<=16;
所以在n=16的时候有52个香蕉,带走50,剩下2个,猴子走到17米的时候其实是可以直接不回头一直往家走的,当然也可以回到16米处拿剩下的2个香蕉,但不管怎样在17米处,猴子都只剩下49个香蕉了,从此以后再也不用考虑要不要回去拿香蕉了,那么剩下的33米路程猴子要吃掉33个香蕉,最后带回家的就只有49-33=16

    
发表于 2015-09-09 20:00:42 回复(2)
走一步,放下去拿后面的会消耗3根,等到即将把一百根中的50根吃完的时候,走了16步,剩下34步。此时剩下52根,走出第17步后剩49,留在第16步2根,如果回去拿16步的两根回来,17步还是剩49根,所以就从16步开始就不用返回,但是52根还是只能带50根,带着50根走剩下的34步,吃34根剩16根。
发表于 2018-09-19 18:38:35 回复(0)
因为猴子不能一次性带所有的香蕉,所以会有一次返回取的过程,为了保证带回的最大数量,每次肯定带所能带的极限香蕉数(50),也就是他只需要往返一次,设第一次折返的为位置为x,则整个过程吃掉的香蕉数为3x+50-x,那么剩下的香蕉数即为:100-(2x-50),即为求次表达式的最大值,但是过程中必须保证猴子有香蕉吃,而且数量不会超过所带的香蕉数,从而有条件:2x<=50,100-3x<=50, 17<=x<=25,取x=17,可得最大数值16
发表于 2017-09-06 17:08:10 回复(0)
只要求猴子走到哪里折返之后正好还有50个香蕉。折返的距离就是剩下的香蕉数
发表于 2017-09-01 09:59:43 回复(0)
猴子最后一次满载50,等于说之前‘家-始发地-家’的方向消耗50个,这50个可以想象三段,50/3取整也就是之后它不用消耗的~(这猴子***能吃)
发表于 2016-09-30 14:52:55 回复(0)
猴子走的路分两段:前一段是走三遍,后一段是走一遍。走后面一段时剩余香蕉越多越好,如果走后一段时剩余大于等于53根那么他至少后面1米还可以走三遍,这样后面1米就不属于后一段了。所以走后一段时剩余小于53根,如果大于等于50根,他就可以拿50根走后一段,没必要有返回路段。如果小于50米前面1米没必要走三遍,也就是说前面1米不属于前一段。所以到达后一段时只可能剩余50、51、52。假设前一段是x米剩余香蕉是100-3x,将50、51、52代入取整得x=16。50-(50-16)=16。
发表于 2016-09-14 10:35:06 回复(0)
猴子必须来来回回才能把所有香蕉都搬走。那么,猴子留50个在原地,拿50个走一步,剩49,把48个放下拿着一个回去路上吃,再带着原地的50个走一步,此时,所有香蕉聚在第一步这个新的起点,是97个。           
在香蕉剩50个以上时,猴子不得不高消耗,走一步消耗3个。(即使不是一步一回头,均值也是三个。)走了16步时,剩52,如果总数是99,那么此时剩51,就可以放弃那一个直接回家了。
在它走了17步时,剩下49个香蕉。此时它终于可以一路直达老家,还剩50-17=33步。所以最终会剩49-33=16个香蕉。    “嗝~”
编辑于 2016-08-19 15:03:47 回复(0)
因为猴子最多只能带50根香蕉,但是有100根,所以一定至少要分两趟才能带走,而两趟就是3个来回(从原点出发到一个地方,设走了x米,然后再回去,再带着另外50根香蕉走到x处,所以是3个来回),现在就要求这个x,显然是x=50/3=16.666,因此x=17,也就是第一次带50根香蕉走17米,还剩下33根,再消耗17根香蕉回去拿剩下的50根香蕉,则剩下16根了(这个是在17米处还有16根香蕉)。第二趟回原点拿了50根香蕉走17米,还剩33,加上原来的16,所以整个第一阶段走出17米之后还剩49根;第二阶段,剩下还有50-17=33米,因此需要再消耗33根,则最后走完50米,还有16根咯!!!至于为什么这么走会是最大呢?估计是来回趟数越少,则消耗的香蕉最少了。
发表于 2016-07-13 15:06:50 回复(0)