3626 - 蚂蚁

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

一根长度为L的长细杆上有N只蚂蚁,这N只蚂蚁正在行走,所有的蚂蚁每1个单位时间走1个单位长度,当蚂蚁爬

到杆子的端点就会掉落。

因为杆子太细,所以每当有两只蚂蚁相遇的时候,他们只能沿原路返回。

初始时不知道各个蚂蚁的朝向(不知道他们是向右还是向左)

但是知道每一只蚂蚁到细杆左端的距离a[i],现在我想知道,所有蚂蚁掉下杆子所需的最短时间和最长时间。

限制:
1<=L<=10^6  1<=n<=10^6  0<=a[i]<=L

题目输入

输入一个整数T,表示有T种情况;
对于每种情况:
输入L和N,用空格隔开;
接下来输入a[i];

题目输出

对于每一种情况,输出最小时间和最大时间;

输入/输出样例

输入格式

2
10 3
2 6 7
214 7
11 12 7 13 176 23 191

输出格式

4 8
38 207

C语言解答

#include <stdio.h>
int a[1000001];
int max(int a,int b)
{
	if(a>b)
	return a;
	else
	return b;
}
int min(int a,int b)
{
	if(a<b)
	return a;
	else
	return b;
}
int main()
{
	int t,n,l,i,j,Min,Max;
	while(scanf("%d",&t)!=EOF)
	{
		for(i=1;i<=t;i++)
		{
			Min=Max=-1;
			scanf("%d%d",&l,&n);
			for(j=0;j<n;j++)
			scanf("%d",&a[j]);
			for(j=0;j<n;j++)
			{
				Min=max(Min,min(a[j],l-a[j]));
				Max=max(Max,max(a[j],l-a[j]));
			}
			printf("%d %d\n",Min,Max);
		}
	}
	return 0;
}

C++解答

#include<string.h>  
#include<stdio.h>  
#include<stdlib.h>  
#include<iostream>  
#include<vector>  
#include<algorithm>  
using namespace std;  
int a[1000000+5];
int maxx(int a,int b){
	if(a > b) return a;
	else return b;
}
int minn(int a,int b){
	if(a > b) return b;
	else return a;
}
int main(){
	int t;
	while(scanf("%d",&t)!=EOF){
		while(t--){
			int l,n;
			scanf("%d%d",&l,&n);
			for(int i = 0;i < n;i++)
				scanf("%d",&a[i]);
			int max = 0,min =0;
			for(int i = 0;i < n;i++){
				int t;
				t = minn(l - a[i],a[i]);
				if(t > max) max = t;
			}
			for(int i = 0;i < n;i++){
				int t;
				t = maxx(l - a[i],a[i]);
				if(t > min) min = t;
			}
			printf("%d %d\n",max,min);
		}		
	}
	return 0;
}