蚂蚁爬竿相遇问题
在思考算法之前,我们得仔细想想蚂蚁相遇时的情形,相遇时两只蚂蚁分别掉头,我们可以把蚂蚁想象成完全一模一样的,于是相遇掉头就好像没有掉头而是擦肩而过。于是复杂的相遇问题转化为许多只只蚂蚁各自在竿子上往某一段爬。
在上面的分析下,我们再来看什么时候所有蚂蚁落下竿子所需的时间最短,注意是所有蚂蚁。因为蚂蚁在竿子上起始点的方向并没有确定,所以我们为了保证最短,假设所有蚂蚁往离自己最近的竿子末端爬,所以越往竿子中心靠,蚂蚁落下竿子花的时间就越长,而我们要保证所有的蚂蚁都要掉下去,于是满足的最短时间就是最靠近竿子正中的那只蚂蚁爬行的时间。
同样,为了得到所有蚂蚁掉落花费的最长时间,我们得假设所有蚂蚁向离自己最远的那一端爬,于是离两端越近的蚂蚁,爬到另一端的时间显然就越长,为了保证所有蚂蚁都要掉下竿子,所以我们找出离竿子中心最远,也就是离竿子两端最近的蚂蚁所爬行的时间,就是所有蚂蚁掉下竿子的最长时间。
于是算法如下
// 输入
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);
}