您的位置:首页 > 职场人生

百度面试题(著名的蚂蚁问题)

2007-12-25 17:10 295 查看
题目:有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时, 蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米 的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。
以上题目来源:http://www.blog.sh/user3/king821221/110716.html

问题分析:
1.最小时间肯家是各自朝最近的一端跑,27-11=14,11<14,所以中间的蚂蚁会朝11cm那端跑,最适时短时间11。
2. 最长时间呢,肯定两端的蚂蚁都往中间跑,具体怎么跑好像有点儿想不清楚,那试算之,假设3cm处的和7cm处的相对而行,碰面后会怎样?如果你眼神不好, 你会发现你分不出来哪个是哪个,因为3cm的转头后就相当于7cm的一直在走。到这里,一切就已经没有刚开始那样想不清楚了,事情很清楚:蚂蚁碰头可以用 等量代换的思想,在这种情况下,任何蚂蚁都是自由地向它面向的一端直接爬过去。那最长时间就清楚了:27-3=24,27-23=4 24>23,所以最长时间是24。
有了以上分析,算法就简单了。
算法:
1.找出中间的蚂蚁离两端的距离中较小的。
a[2]=11
a[2]'=27-11=14,
因为a[2]<a[2]',所以最小距离是11,时间11/1=11
2.找出两端的蚂蚁距两端的距离中较大的。
a[0]=3
a[0]'=27-3=24
a[4]=23
a[4]'=27-23=4
这四个数中最大的是24
3.所以,最大时间24,最小时间11
程序:略。

路老师也出了一道题:
有 一群海盗抢了很多金币,有一天,海盗头子拿出一些金币分成100袋,每次作战前随机抽出一袋,奖励这次作战第一个登上商船的部下(如果第一个上去的没有活 着回来,则奖给第二个),后来这100袋都分完了,结果得奖的勇士们发现,这个分配太不公平,因为最多的有100个,有的是37个,有的是89个,最少的 甚至只有一个。最后大家惊奇地发现,居然每一袋的个数都不一样。试问海盗头子总共拿出了多少金币?
程同学的解答如下:
代码如下:
#include <iostream>
#include <cstdlib>

#define BAG_MAX 100
#define COIN_MAX 100
using namespace std;

//取得第i个在1-100之间的随机数
int get_random(int cur)
{
   static int money[BAG_MAX]; //保存已经用过的金币数目
   int cur_money=rand()%COIN_MAX+1;//产生1-100的随机数
   bool flag=true;
   while(flag)
   {
      for(int i=0;i<cur;i++)
      {
         if(money[i]==cur_money)//金币数重复,重新产生
         {
               cur_money=rand()%COIN_MAX+1;
               break;
         }
      }
      if(i==cur) flag = false;//i=cur时说明新产生的金币数没有重复的。
      money[cur]=cur_money;
   }
   cout<<cur_money<<endl;
   return cur_money;
}
//本程序很好地模拟了海盗头子分发金币的过程
//并统计出了金币总数
int main()
{
   int total =0;
   for(int i=0;i<BAG_MAX;i++)
   {
        total+=get_random(i);
   }
   cout<<total<<endl;
}
王者之剑的点评:
嗯,程同学充分理解了客户(路老师)的思想,真实再现了客户的业务流程,程序可能不太简洁,但容易理解,运行结果正确,效率也没有问题,完全符合把复杂的事情让计算机去做,人要把精力放在业务上的信息化思想。
程同学(紧紧握住王者之剑的手):
前几天还在CSDN上看到讨论程序员要不要学数学的SB问题,当时就觉得变态,现在都什么时代了阿,是业务时代了阿,中国的信息化进程这么慢,就是因为缺少务实的业务专家,大家都去专研能够节省2K内存的算法,要是多一些象您这样的专家多好。

 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息