【问题描述】
一队蚂蚁在一根水平杆上行走,每只蚂蚁固定速度 1cm/s. 当一只蚂蚁走到杆的尽头时,立即从秆上掉落. 当两只蚂蚁相遇时它们会掉头向相反的方向前进. 我们知道每只蚂蚁在杆上的初始位置, 但是, 我们不知道蚂蚁向哪个方向前行. 你的任务是计算所有蚂蚁都杆上掉落可能的最短时间和最长时间.
【输入描述】
第一行包含一个整数,给出测试实例数量. 每组数据开始有两个整数: 杆的长度 (单位:cm) 和杆上蚂蚁数量 n. 之后是 n 个整数给出每只蚂蚁从杆的最左边开始的位置, 且是无序的. 输入的每个整数都不大于 1000000 ,两个数字用空格分开.
【输出描述】
对于每组输入输出两个整数. 第一个整数表示所有蚂蚁从杆上掉落可能的最短时间(如果它们前行方向选择得当) ,第二个整数表示可能的最长时间.
【样例输入】
2
10 3
2 6 7
214 7
11 12 7 13 176 23 191
【样例输出】
4 8
38 207
两个蚂蚁相遇以后如果在调转方向,该过程太过复杂,可以看成两个蚂蚁在相遇以后交换位置(或者可以看成直接沿一个方向走到头)
AC代码一:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 1000000+10;
int a[maxn];
int main ()
{
int T,n,tmin,tmax,i,l,l2;
scanf("%d",&T);
while(T--)
{
tmin=0;
scanf("%d%d",&l,&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
tmax=max(l-a[0],a[n-1]);
tmin=min(a[0],l-a[0]);
for(i=1;i<n;i++)
{
tmin=max(tmin,min(a[i],l-a[i]));
}
printf("%d %d\n",tmin,tmax);
}
return 0;
}
AC代码二:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=1000000;
int small[maxn],big[maxn];
int main()
{
int t,length,mynum,weizhi,i,j,m;
scanf("%d",&t);
while(t--)
{
j=0;m=0;
memset(small,0,sizeof(small));
memset(big,0,sizeof(big));
scanf("%d",&length);
scanf("%d",&mynum);
for(i=0;i<mynum;i++)
{
scanf("%d",&weizhi);
if(weizhi>length/2)
{
big[m++]=weizhi;
small[j++]=length-weizhi;
}
else
{
big[m++]=length-weizhi;
small[j++]=weizhi;
}
}
sort(small,small+j);
sort(big,big+m);
printf("%d %d\n",small[j-1],big[m-1]);
}
return 0;
}