蚂蚁杆子问题

问题:算法

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

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

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

的最短期和最长时间。设计

分析:blog

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

二、接下来,为了思考最长时间的状况,让咱们看看蚂蚁相遇时会发生什么。
程序设计



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

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

这样,不论最长时间仍是最短期,都只要对每只蚂蚁检查一次就行了,这是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;
}

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