两个蚂蚁碰头后方向掉转的问题。
最短时间很简单,只要所以蚂蚁都向一个方向运动,则最短时间就是各个蚂蚁到达左端或右端中最小值的最大值。
最长时间只要从简单的两支蚂蚁分析即可。
我们假设有两只蚂蚁,分别位于x1,x2,长度为n,则最长时间可能为n-x1或者是x2,两者相比即可出结果。
现在假设有三只蚂蚁。分别位于x1,x2,x3。总共有8种运动方向,每种运动方向都有一个时间,我们可以算出最长的时间出来。但可以明显踢出一些方向上的运动时间,不能踢出的我们就进行比较,叫做当前可比较时间。若都向左方,或者是右方运动,则最长时间为n-x1,或者是x3..若x1向左端运动,则对x2,x3无影响,就相当于x2,x3两只蚂蚁爬行。则最长时间为n-x2,或者为x3。n-x2<n-x1.所以当前可比较的最长时间仍然为n-x1和x3.同理x3向右运动,可比较的最长时间仍和前面的一样。剩下的就是x1向右,x3向左了。那么x2有两种运动情况,一是向左,相当于在(x1+x2)/2=x4处和蚂蚁1碰头,则蚂蚁1就向左运动了,对蚂蚁2和3无影响,又回到了两只蚂蚁的情况,这时候最长运动时间可能为n-x4或者是x5.x5为蚂蚁3在蚂蚁1和2碰头时所处的位置,x5一定是小于x3的。所以这两种最长时间都比n-x1或者x3小。所以目前比较的仍然是n-x1和x3.所以同理,无论多少只蚂蚁在运动,我们只要比较n-x1和xn处的值。
AC代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX_NUMBER = 100005;
int position[MAX_NUMBER];
int main()
{
int test_case;
cin >> test_case;
while (test_case--) {
int lenth,number;
cin >> lenth >> number;
memset(position,0,sizeof(position));
for (int i = 0;i < number; i++) {
cin >> position[i];
}
sort(position,position+number);
int earliest_time = 0;
for (int i = 0;i < number; i++) {
int current_early_time = (position[i] < lenth-position[i])?position[i] : lenth - position[i];
if (current_early_time > earliest_time) {
earliest_time = current_early_time;
}
}
int lastest_time_left = lenth - position[0];
int lastest_time_right = position[number - 1];
int lastest_time = lastest_time_left > lastest_time_right ? lastest_time_left : lastest_time_right;
cout << earliest_time << " " << lastest_time << endl;
}
return 0;
}