[百度]爬行的蚂蚁

题目描述

 

有些蚂蚁在一条水平线上爬行,每只蚂蚁的速率都是1cm/s。蚂蚁爬到水平线的任何一个端点时会马上掉下来,当两只蚂蚁碰到一块儿时他们都会马上调头向相反方向移动。ios

已知蚂蚁们在水平线上的初始位置,但不幸的是,它们初始的运动方向是不知道的。请计算全部蚂蚁从水平线上掉下来可能所需的最先和最晚的时间。测试

 

 

输入

 

第一行有一个整数,表示有多少组测试数据。this

每组测试数据以两个整数开始:水平线长度(单位cm)和蚂蚁数,随后的一行中有n个整数,表示每只蚂蚁距水平线左端点的距离。全部的输入的整数都小于1000000并且用空格隔开。spa

 

 

样例输入

 

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

 

输出

 

对于每组测试数据,在同一行输出两个整数,第一个表示全部蚂蚁从水平线上掉下来的最先时间,第二个表示最晚时间。内存

 

样例输出

 

4 8
38 207ci

 

时间限制C/C++语言:1000MS其它语言:3000MSit

内存限制C/C++语言:65536KB其它语言:589824KBio

 

 

首先,讲一下思路:蚂蚁碰头后掉头,能够看成蚂蚁能够直接”穿过“对方,即蚂蚁碰头对蚂蚁运动没有影响。而后能够转换为每一只蚂蚁从初始位置直接到离开木杆的场景。
求最短期:以木杆中心为基准,左边的蚂蚁往左走,右边的蚂蚁往右走,这样子,左右两边的最短期就是所求的最短期。
求最长时间:以木杆中心为基准,左边的蚂蚁往右走,右边的蚂蚁往左走,这样子,时间就会最长 table

 

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
	int t;
	cin >> t;
	
	
	for (int i=0;i<t;i++) {
		
		int l, n;
		cin >> l >> n;
		
		int pos[n];
		int min = 0, max = 0;
		for (int i=0;i<n;i++) {
			cin >> pos[i];
			
			int thisMin, thisMax;
			if (pos[i] >= (l/2)) {
				thisMin = l - pos[i];
				thisMax = pos[i];
			} else {
				thisMin = pos[i];
				thisMax = l - pos[i];
			}
			
			if (thisMin > min) {
				min = thisMin;
			} 
			
			if (thisMax > max) {
				max = thisMax;
			}
		} 
		cout << min << " " << max << endl;
		
//		sort(pos, pos+i);
//		
//		cout << pos[0] << " " << pos[n-1] << endl;
		
	}
  
	return 0;
}