算法起步(2)

来源:互联网 发布:花与剑 js 编辑:程序博客网 时间:2024/06/11 05:07

蚂蚁相碰问题-化繁为简

n只蚂蚁以1cm/s的速度在长为Lcm的竿子上爬行。当蚂蚁爬到竿子的端点时就会掉落。由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反向爬回去。对于每只蚂蚁,我们知道它距离竿子左端的距离x1,但不知道它当前的朝向。请计算所有蚂蚁落下竿子所需的最短时间和最长时间
限制条件 L(1,10^6)
n (1,10^6)
xi (0,L)


首先笔者的思维:如果以正常思维来想,此题是无解的,为什么呢?

蚂蚁的朝向有2^n中,在这么多的情况中,哪一种最短,哪一种最长,计算机虽然善于复杂运算,但是必须要这么做吗?

两个蚂蚁相碰背道而行,其实可以看作他们没有相碰彼此各走各的路,这听起来有些抽象,但是这便是其巧妙之处,我们只需要专注
于每只蚂蚁的行动即可,蚂蚁之间毫不影响,这样我们的思路就出
来了,有点脑筋急转弯的意思~哈哈


    int L,N;    int X[MAX_N];    void solve(){    计算最小距离    int minT = 0;    for(i = 0; i < n;i++){    minT = min(minT,min(x[i],L - x[i]))    }    计算最大距离    int maxT = 0;    for(i = 0; i < n;i++){    maxT = max(maxT,max(x[i],L-x[i]))    }    printf("%d %d/n",minT,maxT);    }
  看似互相影响,其实确实互不干扰,化繁为简
0 0
原创粉丝点击