题目描述
有些蚂蚁在一条水平线上爬行,每只蚂蚁的速率都是1cm/s。蚂蚁爬到水平线的任何一个端点时会立刻掉下来,当两只蚂蚁碰到一起时他们都会立刻调头向相反方向移动。
已知蚂蚁们在水平线上的初始位置,但不幸的是,它们初始的运动方向是不知道的。请计算所有蚂蚁从水平线上掉下来可能所需的最早和最晚的时间。
输入 第一行有一个整数,表示有多少组测试数据。 每组测试数据以两个整数开始:水平线长度(单位cm)和蚂蚁数,随后的一行中有n个整数,表示每只蚂蚁距水平线左端点的距离。所有的输入的整数都小于1000000而且用空格隔开。 |
样例输入 2 |
输出 对于每组测试数据,在同一行输出两个整数,第一个表示所有蚂蚁从水平线上掉下来的最早时间,第二个表示最晚时间。 |
样例输出 4 8 |
时间限制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;
}