【纯水题】POJ 1852 Ants

题目大意

有一根长(L)厘米米的水平木棍上有(n)个蚂蚁,它们以每秒1cm/s的爬(fei)行(ben)到木棍的一端,之后掉下去。
给出每个蚂蚁的起始位置,但是不知道它们爬行的方向。相向而行的两只蚂蚁相遇后,它们都会掉头往反方向走。
求所有蚂蚁都落下木棍的最大时间和最小时间。

输入格式

先给出数据组数(T)
每组第一行给出木棍长度(L)和蚂蚁数量(n)((1le nle 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
",getmin(),getmax());
	}	
	return 0;
}
原文地址:https://www.cnblogs.com/Midoria7/p/12697246.html