[百度]爬行的蚂蚁

题目描述
									

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

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

输入

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

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

样例输入

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

输出

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

样例输出

4 8
38 207

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

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

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

#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;
} 

猜你喜欢

转载自blog.csdn.net/xiaocong1990/article/details/82901081
今日推荐