Poj1852(Ants)

Poj1852(Ants)_第1张图片
Ants

Poj1852(Ants)_第2张图片
样例

题目分析:

  • 首先很容易想到一个穷竭搜索(暴搜)算法,即枚举所有蚂蚁的初始朝向的组合,这可以利用递归函数实现。每只蚂蚁的初始朝向都有2种可能,n只蚂蚁就是2×2×…×2=2^n种。如果n比较小,这个算法还是可行的,但指数函数随着n的增长会急剧增长。
  • 首先对于最短时间,看起来所有蚂蚁都朝向较近的端点走会比较好。事实上,这种情况下不会发生两只蚂蚁相遇的情况,而且也不可能在比此更短的时间内走到竿子的端点。
  • 思考最长时间的情况,让我们看看蚂蚁相遇时会发生什么。


    Poj1852(Ants)_第3张图片

    事实上,可以知道两只蚂蚁相遇后,当它们保持原样交错而过继续前进也不会有任何问题。这样看来,可以认为每只蚂蚁都是独立运动的,所以要求最长时间,只要求蚂蚁到竿子端点的最大距
    离就好了。
    这样,不论最长时间还是最短时间,都只要对每只蚂蚁检查一次就好了,这是O(n)时间的算法.

int L, n;
int x[MAX_N];
void solve()
{
    // 计算最短时间
    int minT = 0;
    for (int i = 0; i < n; i++)
    {
        minT = max(minT, min(x[i], L - x[i]));
    }
    // 计算最长时间
    int maxT = 0;
    for (int i = 0; i < n; i++)
    {
        maxT = max(maxT, max(x[i], L - x[i]));
    }
    printf("%d %d\n", minT, maxT);
}

你可能感兴趣的:(Poj1852(Ants))