蚂蚁杆子问题

来源:互联网 发布:淘宝确认自动收货时间 编辑:程序博客网 时间:2024/04/29 15:06

问题:

n 只蚂蚁以每秒1cm 的速度在长为Lcm 的竿子上爬行。当蚂蚁爬到竿子的端点时就会掉落。

由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反向爬回去。对于每只蚂蚁,

我们知道它距离竿子左端的距离xi,但不知道它当前的朝向。请计算所有蚂蚁落下竿子所需

的最短时间和最长时间。

分析:

1、首先对于最短时间,看起来所有蚂蚁都朝向较近的端点走会比较好。事实上,这种情况下不会发生两只蚂蚁相遇的情况,而且也不可能在比此更短的时间内走到竿子的端点。

2、接下来,为了思考最长时间的情况,让我们看看蚂蚁相遇时会发生什么。



事实上,可以知道两只蚂蚁相遇后,当它们保持原样交错而过继续前进也不会有任何问题。这样看来,可以认为每只

蚂蚁都是独立运动的,所以要求最长时间,只要求蚂蚁到竿子端点的最大距离就好了。

这样,不论最长时间还是最短时间,都只要对每只蚂蚁检查一次就好了,这是O(n)时间的算法。

对于限制条件n ≤ 10的六次方,这个算法是够用的,于是问题得解。


#include <stdio.h>

#define MAX_N 100

//定义两个函数,取最大值、最小值
static int max(int x,int y);

static int min(int x,int y);

int main(int argc, char** argv)
{
int n;
int L;
int x[MAX_N];

scanf("%d", &n);//蚂蚁个数
scanf("%d", &L);//杆子长度

int i = 0;

for(i=0;i<n;i++)
{
scanf("%d", &x[i]);//每个蚂蚁距离杆子左端的距离
}

printf("n=%d,L=%d\n",n,L);
for(i=0;i<n;i++)
{
printf("x[%d]=%d,", i,x[i]);
}


printf("\n");
/*先找出每个蚂蚁的最小时间,将这些时间比较,找出最大的时间。即为蚂蚁落下的最短时间*/
int Time = 0;
for(i=0;i<n;i++)
{
Time = max(Time, min(x[i], L-x[i]));
}


printf("the shortest tiem is:%d\n", Time);


printf("----------------------------------------\n");

/*先找出每个蚂蚁的最时间,将这些时间比较,找出最大的时间。即为蚂蚁落下的最时间*/
Time = 0;
for(i=0;i<n;i++)
{
Time = max(Time, max(x[i], L-x[i]));
}


printf("the longest tiem is:%d\n", Time);


return 0;
}


static int max(int x,int y)
{
return x>y?x:y;
}


static int min(int x,int y)
{
return x>y?y:x;
}

参考 文章 :【迷你书】挑战程序设计竞赛

原创粉丝点击