题目大意:很多的蚂蚁都在长度为L(cm)的膀子上爬行,它们的速度都是1cm/s,到了棒子终端的时候,蚂蚁就会掉下去。如果在爬行途中遇到其他蚂蚁,两只蚂蚁的方向都会逆转。已知蚂蚁在棒子的最初位置坐标,但是我们不知道他们会往哪一个方向爬。请求出所有蚂蚁掉下去的最短时间和最长时间。
题目分析:虽然当蚂蚁数量很多的时候情况会有很多种,但是先考虑小数量的分析就可以找到解决方法:如果只有两只的话,那么最短时间就是两只蚂蚁距离两端点距离较小的距离中取大者就是所需最短时间,而最长时间就是两只蚂蚁距离两端点距离较大者中取大者就是所需最长时间,例如,长度为10,一只在距离左端2的位置,一只在距离左端6的位置,则最短时间为max(min(2,10-2),min(6,10-6))为4,最长时间为max((max(2,10-2),max(6,10-6)))为8其实就是两只相向而行,当相遇后,都转为逆向,则时间为从相遇点到端点距离大者与相遇前所需时间,分析实际就是2到10的距离,当蚂蚁数量增加时,情况相同则需要时间最长的的就是让距离端点最近的蚂蚁爬到另一个端点(最远)所需要的时间也就是说,只要找出所有蚂蚁与较远端比较,然后找出最大值就是所需要的最大时间在距离短的一边中求出最大的一边。就能找到距离端点最远的蚂蚁需要爬到端点的时间
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 1000000
const int inf=1<<29;
int a[N];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,l;
scanf("%d%d",&l,&n);
int i;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int MIN=0;
int MAX=0;
for(i=0;i<n;i++)
{
MIN=max(MIN,min(a[i],l-a[i]));
}
for(i=0;i<n;i++)
{
MAX=max(MAX,max(a[i],l-a[i]));
}
printf("%d %d\n",MIN,MAX);
}
return 0;
}