算法起步(2)

蚂蚁相碰问题-化繁为简

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);
    }
  看似互相影响,其实确实互不干扰,化繁为简
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值