题意:在一根有限长竹竿上,有很多只蚂蚁,每只蚂蚁的爬行速度相同,但是方向是任意的,当两只蚂蚁相遇后,它们就会反向爬行,速度不变,求所有蚂蚁掉下竹竿的最早和最晚时间。
解法:乍一看很唬人,因为蚂蚁的方向是不确定的,但是试想,蚂蚁A和蚂蚁B相遇以后,各自反向,但是速度是不变的,所以我们可以视为没有相遇,只是A、B悄悄的互换了身份而已,现在的B就替A完成剩下的路,而A就替B爬。 如果A爬8s会掉下去的话,蚂蚁B和它相遇后,那么8s后B一点会掉下去。SO,最早时间就是所有蚂蚁掉落杆子最短时间中最大的时间(保证所有蚂蚁都落下去),最晚时间就是最长时间里最长的。
代码:
/*
uva10714 Colliding Ants
AC by warteac
2013-4-11
Runtime:0.280s
*/
#include<iostream>
#include<vector>
using namespace std;
class CollidingAnts{
private:
vector <int> minTime;
vector <int> maxTime;
int earlist;
int latest;
public:
void initial();
bool readCase();
void computing();
void outResult();
};
void CollidingAnts::initial(){
minTime.clear();
maxTime.clear();
earlist = 0;
latest = 0;
}
bool CollidingAnts::readCase(){
int poleLen,numOfAnts,m;
cin >> poleLen >> numOfAnts;
while(numOfAnts--){
cin >> m;
minTime.push_back(min( m , poleLen - m));
maxTime.push_back(max( m , poleLen - m));
}
}
void CollidingAnts::computing(){
earlist = 0;latest = 0;
for(int x = 0; x < minTime.size(); x++){
earlist = max(earlist, minTime[x]);
}
for(int y = 0;y < maxTime.size(); y++){
latest = max(latest, maxTime[y]);
}
}
void CollidingAnts::outResult(){
cout<<earlist<<" "<<latest<<endl;
}
int main(){
CollidingAnts ca;
int n;
cin >> n;
while(n--){
ca.initial();
ca.readCase();
ca.computing();
ca.outResult();
}
}