POJ1852-Ants

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40530943/article/details/81059857

描述

一群蚂蚁在长度为1厘米的水平杆上行走,每根杆的速度恒定为1厘米/秒。当一只行走的蚂蚁到达极的一端时,它会立即脱落。当两只蚂蚁相遇时,它们会转身向相反方向开始行走。我们知道蚂蚁在杆子上的原始位置,不幸的是,我们不知道蚂蚁行走的方向。你的任务是计算所有蚂蚁从杆上掉下来所需的最早和最晚时间。

输入

第一行输入包含一个整数,给出后面的案例数。每种情况的数据都以两个整数开始:极点的长度(cm)和n,极点上的蚂蚁数量。这两个数字后面跟着n个整数,它们将每个蚂蚁在杆上的位置作为从杆的左端测量的距离,没有特别的顺序。所有输入整数都不大于1000000,它们由空格分隔。

产量

对于每种输入情况,输出由单个空格分隔的两个数字。第一个数字是所有蚂蚁从杆上掉下来的最早时间(如果他们的步行路线选择得恰当),第二个数字是最新可能的时间。 

样本输入

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

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

样本输出

4 8
38 207
38 207

首先考虑最短时间,如果每只蚂蚁都向离自己最近的一方进行移动,则不会相遇且时间最短

想一下最长时间,当两只蚂蚁相遇时,各自向相反方向移动,相当于无视掉另外一只蚂蚁,继续运动。

即最长时间是每只蚂蚁都向自己最远的一方进行移动。

需要注意的是,本题需要关闭同步流

#include<iostream>
#include<algorithm>
int a[1000000];
using namespace std;
void solve(int a[],int m,int l)
{
	int max_n=0,min_n=0;
	for(int i=0;i<m;i++)
	{
		min_n=max(min_n,min(a[i],l-a[i]));
		max_n=max(max_n,max(a[i],l-a[i]));
	}
	cout<<min_n<<" "<<max_n<<endl; 
}
int main()
{
	ios::sync_with_stdio(false);
	int num;
	cin>>num;
	for(int i=0;i<num;i++)
	{
		int l,n;
		cin>>l>>n;
		for(int j=0;j<n;j++)
		{
			cin>>a[j];
		}
		solve(a,n,l);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_40530943/article/details/81059857