题意很清楚,但是刚开始看确实没有任何思路,因为对我来说,即使暴力穷举,由于碰撞问题的复杂性(或者是我单纯的菜)依旧是解决不了的,更何况穷举所带来的指数级的时间复杂度,对于这个数量的数据,基本也会时间超限。
之前看了下别人的思路,发现,其实最短时间,只需要蚂蚁将方向转到离端点最近的方向就可以了,
至于最长时间,我们可以发现,当将两只蚂蚁无差别话后,两只蚂蚁即使相遇后向反方向行走,但是我们可以看成两只蚂蚁交错过去依旧按起始方向行走,这样每只蚂蚁都是独立运动的,那么只需要算每只蚂蚁掉下去的时间并找出最长时间即可
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 1000000;
int temp[MAXN];
int main()
{
int t;
cin>>t;
while(t--){
int l,n;
scanf("%d%d",&l,&n);
int Mina = -1,Maxa = -1;
for(int i = 0; i < n; i++){
scanf("%d",&temp[i]);
/*最短*/ Mina = max(Mina,min(temp[i],l - temp[i]));//两处都使用max是因为要求所有蚂蚁都从杆上落下的时间
Maxa = max(Maxa,max(temp[i],l - temp[i]));//最长
}
printf("%d %d\n",Mina,Maxa);
}
return 0;
}