题目大意:N只蚂蚁在长度为[0, M]的线段内活动,给出蚂蚁位置,蚂蚁速度为单位距离/秒,求出所有蚂蚁掉下去(爬出线段区域)的最小和最大时间。
蚂蚁运动方向不定,两只蚂蚁相遇后,双双改变运动方向。
解题策略:1,相遇问题
假设A,B两只蚂蚁相遇,
{A,B改变运动方向} 等价于 {A,B交换运动状态}(可以理解为A,B相遇后A成为B, B成为A)
2,全部“掉下去”最少时间
关键词:全部,最少。
思路:对单个蚂蚁分析,其运动方向要么向左,要么向右,该蚂蚁掉下去最少时间 = 该蚂蚁距线段左右边界最小值 / 速度;
若满足全部蚂蚁都掉下去,则应为所有掉下去最少时间的最大值,即单只蚂蚁距线段左右边界最小值的最大值;
3,全部“掉下去”最大时间
分析同2,最大时间应为单只蚂蚁距线段左右边界最大值的最大值。
代码实际一个循环就可以搞定,写得略繁琐。
/*
Collding Ants
AC by J_Dark
ON 2013/4/10
*/
#include <iostream>
#include <climits>
#include <algorithm>
using namespace std;
const int maxn = 1000005;
struct an{
int pos, minPos, maxPos;
}ant[maxn];
int main(){
int testCase, left=0, right;
int antsNum;
while(cin >> testCase)
{
while(testCase--)
{
cin >> right >> antsNum;
int t1, t2;
int minTime=INT_MIN, maxTime=INT_MIN;
for(int i=0; i<antsNum; i++){
cin >> ant[i].pos;
t1 = ant[i].pos;
t2 = right - ant[i].pos;
ant[i].minPos = min(t1, t2);
ant[i].maxPos = max(t1, t2);
}
for(int i=0; i<antsNum; i++){
minTime = max(minTime, ant[i].minPos);
maxTime = max(maxTime, ant[i].maxPos);
}
cout << minTime << " " << maxTime << endl;
}
}
//system("pause");
return 0;
}