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