

题目分析:
- 首先很容易想到一个穷竭搜索(暴搜)算法,即枚举所有蚂蚁的初始朝向的组合,这可以利用递归函数实现。每只蚂蚁的初始朝向都有2种可能,n只蚂蚁就是2×2×…×2=2^n种。如果n比较小,这个算法还是可行的,但指数函数随着n的增长会急剧增长。
- 首先对于最短时间,看起来所有蚂蚁都朝向较近的端点走会比较好。事实上,这种情况下不会发生两只蚂蚁相遇的情况,而且也不可能在比此更短的时间内走到竿子的端点。
-
思考最长时间的情况,让我们看看蚂蚁相遇时会发生什么。
事实上,可以知道两只蚂蚁相遇后,当它们保持原样交错而过继续前进也不会有任何问题。这样看来,可以认为每只蚂蚁都是独立运动的,所以要求最长时间,只要求蚂蚁到竿子端点的最大距
离就好了。
这样,不论最长时间还是最短时间,都只要对每只蚂蚁检查一次就好了,这是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);
}
网友评论