红联Linux门户
Linux帮助

IT应聘题!作出来服你!!

发布时间:2008-09-25 09:04:38来源:红联作者:zl2054890
一栋100层高的楼房,其中第n层是分界线,从这层扔下去的瓶子,着地后会毫发无损,但从这层往上扔下的瓶子就会摔碎。现在给你两个这样的瓶子,让你找出n是哪一层。
这是我面试时考官出的一道题,很难我没做出来,用到数学的东西很多。大家帮忙做做!
文章评论

共有 12 条评论

  1. maoyong1023 于 2008-10-23 13:51:44发表:

    for(int i = 1;i <= 100;i += 10)
    {
    if(drop(i) == BROKEN) {
    n = i - 10;
    if(n < 1)
    n = 1;
    while(1) {
    if(drop(n) == UNBROKEN) {
    n++;
    }
    else {
    printf("分界线就是:%d\n",n-1);
    break;
    }
    }
    }
    }

  2. deepmist 于 2008-10-06 18:45:32发表:

    1楼的想法

  3. chris078426 于 2008-10-06 13:01:26发表:

    (hl):hao

  4. chris078426 于 2008-10-06 13:00:38发表:

    ):o:s

  5. 天明 于 2008-10-05 10:40:36发表:

    我觉得有点想脑筋急转弯,n应该一层吧

  6. changheluori 于 2008-09-26 19:29:12发表:

    间隔10层的原因我已经说了
    测的总次数N=100/m + m (m就是间隔的层数)
    数学易知100/m = m 时 N 取最小值
    即m=10时 N最小

  7. zl2054890 于 2008-09-26 10:23:57发表:

    引用:
    原帖由 changheluori 于 2008-9-26 08:41 发表
    一楼的方法是最优的
    一楼的方法 如果100楼最多需要20扔次 10000层楼 最多须200 复杂度为n的1/2次方
    三楼的方法 100 最多扔100 10000层楼 最多仍10000 -1 ...


    用复杂度作为衡量标准很不错

  8. zl2054890 于 2008-09-26 10:20:41发表:

    忘了说了,还有一个条件就是,测试的次数要最少。说白了就是隔多少层测一次。像二楼说的,是以十层为间隔测试,会不会有更好的方法使测试次数更少呢?

  9. changheluori 于 2008-09-26 08:41:35发表:

    一楼的方法是最优的
    一楼的方法 如果100楼最多需要20扔次 10000层楼 最多须200 复杂度为n的1/2次方
    三楼的方法 100 最多扔100 10000层楼 最多仍10000 -1 复杂度为n
    所以一楼最优

  10. wolecho 于 2008-09-25 22:15:36发表:

    你没有限定扔多少次,我只要一个瓶子,从第二层开始扔。
    哪一层碎了N就是下面那一层

  11. lmguy 于 2008-09-25 13:16:49发表:

    往下扔的时候没有初速度,往上扔的时候有初速度

  12. changheluori 于 2008-09-25 09:54:27发表:

    我的想法:“从这层扔下去的瓶子,着地后会毫发无损,但从这层往上扔下的瓶子就会摔碎“ 这句话的意思是说如果第n层是分界线的话那么从第n层仍一个瓶子不会碎 从第n+1层仍就会碎了
    那么 可以从第10层仍 如果期间瓶子没有碎(既然没有碎就可以重复利用) 则每增加10层再仍一次 如果在第n层仍的碎了 就在第n-10层在仍另外一个瓶子仍完再从n-9层仍 n-8 n-7层直到n-i层瓶子碎了 那么n-i-1就是分界线

    问题在于为什么是第一个瓶子要每隔十层仍一次 原因在下面
    总的次数 N=(100/m + m)当 100/m=m 时候N最小