题目:n只蚂蚁以每秒 1 cm的速度在长为 L cm的杆子上爬行。当蚂蚁爬到杆子的端点上就会掉落。由于杆子太细,两只蚂蚁相遇时,他们不能交错通过,自能各自反响爬回去。对于每只蚂蚁,我们知道它距离杆子左端的距离xi, 但不知道它当前的朝向。请计算所有蚂蚁落下杆子的最短时间和最长时间
样例输入
3 10
2 6 7
6 100
25 20 50 38 42 15
样例输出
4 8
50 85
-
如果每只蚂蚁一开始就向着距离自己最近的竿子那一端爬,具体来说,在坐标0L/2之间的蚂蚁朝着左端爬,L/2L之间的蚂蚁朝着右端爬,
那么蚂蚁之间就不会相遇(因为蚂蚁的速度是一样的)。为啥这种情况下就是最短的时间?
因为每一只蚂蚁的时间对于自己来说都是最小的,因为是直接朝着自己的方向走的,没有返回也没有相遇,
所以在所有蚂蚁都处于自己最短的时间中只需要取出用时最长的那一个时间作为最终整体的最短用时即可。 -
考虑蚂蚁在相遇后返回,这样的话每只蚂蚁身份都是确定的,但是如果我们不考虑蚂蚁的身份,
将所有蚂蚁都视作相同无差别的,那么如上面右图所示,相当于左图中的蚂蚁1变成了蚂蚁2,蚂蚁2变成了蚂蚁1,
这样的话,就可以看做蚂蚁其实并没有返回,而是"擦身而过"。我们这样想的,就会发现每只蚂蚁不断变身,
那么就相当于每只蚂蚁是独立运动的,每次遇到别的蚂蚁后,就是变身一次而已,并不会影响其运动方向与轨迹。
这样的话,就很简单了,求整体最长时间,就只需要求每只蚂蚁最长使用的情况下的最大值即可。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int mem;
cin>>mem;
while(mem--)
{
int length,n,rmin=0,rmax=0,dista;
cin>>length>>n;
while(n--)
{
cin>>dista;
rmin=max(rmin,min(dista,length-dista));
rmax=max(rmax,max(dista,length-dista));
}
cout<<rmin<<" "<<rmax<<endl;
}
}