【纯水题】POJ 1852 Ants

心不动则不痛 提交于 2020-04-15 09:44:24

【推荐阅读】微服务还能火多久?>>>

题目大意

有一根长\(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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!