题意:有一个一维的数轴,给定其长度len(数轴范围为[0,len])和上面的蚂蚁数n。接下来给出n只蚂蚁的坐标,都位于整数点之上。蚂蚁的移动速度为1,两只蚂蚁迎面相遇立即朝相反方向运动。假设蚂蚁的初始方向未知,问所有蚂蚁掉落数轴的最小和最大时间。
思路:最小时间比较显然,就是所有蚂蚁不碰撞,即偏左的蚂蚁向左走,偏右的蚂蚁向右走(这样想,一旦出现蚂蚁相遇,那么这两只蚂蚁掉落走过的距离之和=len,那么必有一只蚂蚁走过的距离>=len/2。而不出现相撞的话掉落最晚的蚂蚁走过的距离也是<=len/2的)。
最大时间有点像脑筋急转弯。考虑一次相撞,两只蚂蚁方向反向而速度不变,可以看成两只蚂蚁继续走,只不过交换了身份。所以就变成了求某只蚂蚁距离边界最远的距离。
#include <cstdio> #include <algorithm> #include <cstdlib> using namespace std; #define clc(s,t) memset(s,t,sizeof(s)) #define INF 0x3fffffff #define N 25 int T,len,n; int main(){ scanf("%d",&T); while(T--){ int i,j,resmin,resmax; resmin = resmax = 0; scanf("%d %d",&len,&n); for(i = 0;i<n;i++){ scanf("%d",&j); resmin = max(resmin,min(j,len-j)); resmax = max(resmax,max(j,len-j)); } printf("%d %d\n",resmin,resmax); } }