加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

求所有蚂蚁都离开木杆的最小时间和最大时间(5只蚂蚁,27厘米)

(2010-11-28 19:22:12)
标签:

杂谈

分类: poj

百度面试题

有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁。
木杆很细,不能同时通过一只蚂蚁。开始 时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或
调头, 但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可
以走一厘米的距离。
编写程序,求所有蚂蚁都离开木杆 的最小时间和最大时间。

   千万不要把这题想的太复杂。记住题目中所说的蚂蚁的头朝左还是朝右是任意的,那就是说可以假

所有蚂蚁朝同一个方向爬行或者一部分蚂蚁朝同一个方向爬行。
所有蚂蚁都离开木杆的最大时间为max
所有蚂蚁都离开木杆的最小时间为min
细木杆长度为L

那max就是离细木杆某一段最远的那只蚂蚁离开细木杆所花的时间,对此题而言当然是24秒。
要求min,只需要求出哪只蚂蚁离细木杆的中间离得最近即可,分为两种
1 离细木杆中点最近的蚂蚁在中点左边且它离细木杆左端点的距离是A,则min=A
2 离细木杆中点最近的蚂蚁在中点的右边它离细木杆左端点的距离是A,则min=L - A
我的程序代码如下(C++)

#include <iostream>
#include<cmath>

using namespace std;

int main()
{
          scanf("%d",&n);
          int L = 27,P;                                
          scanf("%d",&P);
          int num;
   int halfL = L/2;                          //中点
   int min = 1100000;
   int max = 0;
   int F = 0;
          for(int i = 0; i < P; i ++)
   {
   scanf("%d",&num);
   if(num < min)
    min = num;
   if(abs(num - halfL) < abs(F - halfL))
    F = num;
   if(num > max)
    max = num; 
   }
   max = L - min > max ? (L - min) : max;    //求出离细木杆端点最近的距离   
   if(F < halfL)
   printf("%d ",F);                   //离中点最近的点在中点左边
   else
   printf("%d ",L - F);              //离中点最近的点在中点右边
   printf("%d\n",max);                      //所有蚂蚁都离开木杆的最小时间
          return 0;
}

相信参加过ACM/ICPC的人对这样的题不会陌生的。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有