题目大意
有一根长\(L\)厘米米的水平木棍上有\(n\)个蚂蚁,它们以每秒1cm/s的爬(fei)行(ben)到木棍的一端,之后掉下去。
给出每个蚂蚁的起始位置,但是不知道它们爬行的方向。相向而行的两只蚂蚁相遇后,它们都会掉头往反方向走。
求所有蚂蚁都落下木棍的最大时间和最小时间。
输入格式
先给出数据组数\(T\)。
每组第一行给出木棍长度\(L\)和蚂蚁数量\(n\)(\(1\le n\le 1000000\))。
第二行给出每个蚂蚁距离木棍左端\(x\)米。
样例输入
2
10 3
2 6 7
214 7
11 12 7 13 176 23 191
样例输出
4 8
38 207
思路
谢谢,有被水到
每个蚂蚁有从左和从右两种情况,不过相遇会掉头。
但是所有蚂蚁都是同时出发,而且长得都一样(雾),所以掉头前后的情况是没有区别的。
所以根本不用考虑掉头的情况,直接找每个蚂蚁按原路都掉下去的时间就可以了。
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=1e6+10;
const int INF=0x3f3f3f3f;
int l,n;
int a[maxn];
int getmin(){
int minans=-INF;
for(int i=1;i<=n;i++){
int mintemp=min(a[i],l-a[i]);
minans=max(minans,mintemp);//不要手残写成min函数
}
return minans;
}
int getmax(){
int maxans=-INF;
for(int i=1;i<=n;i++){
int maxtemp=max(a[i],l-a[i]);
maxans=max(maxans,maxtemp);
}
return maxans;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
memset(a,0,sizeof(a));
scanf("%d%d",&l,&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
printf("%d %d\n",getmin(),getmax());
}
return 0;
}
来源:oschina
链接:https://my.oschina.net/u/4355717/blog/3235118