UVa10714

两个蚂蚁碰头后方向掉转的问题。

最短时间很简单,只要所以蚂蚁都向一个方向运动,则最短时间就是各个蚂蚁到达左端或右端中最小值的最大值。

最长时间只要从简单的两支蚂蚁分析即可。

我们假设有两只蚂蚁,分别位于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;
}


你可能感兴趣的:(UVa10714)