前言
大家好,这篇文章我们发布一道新的题目,希望对大家有所帮助。
1. 题目描述
一支蚂蚁军队在长度为 l厘米的横竿上走,每只蚂蚁的速度恒定且为1厘米/秒,米只行走的蚂蚁到达横竿终点的时候,它就立即掉了下去:当两只蚂蚁相遇的时候,它们就调转头,并开始往相反的方向走。我们知道蚂蚁在横竿上原来的位置,但不知道蚂奴行走的方向。请计算所有蚂蚁从横竿上掉下去的最早可能的时间和最晚可能的时间。
输入
输人的第一行给出一个整数,表示测试用例个数。每个测试用例首先给出两个整数:横竿的长度(以厘米为单位)和在横竿上的蚂蚁的数量n。接下来给出n个整数,表示每只蚂蚁在横竿上从左端测量过来的位置,没有特定的次序。所有输人数据不大于1000 00数据间用空格分隔。
输出
对于输人的每个测试用例,输出用一个空格分隔的两个数,第- - 个数是所有的蚂蚁掉下横竿的最早可能的时间(如果它们的行走方向选择合适),第二个数是所有的蚂蚁掉下横竿的最晚可能的时间。
样例输入 | 样例输出 |
---|---|
2 | 4 8 |
10 3 | 38 207 |
2 6 7 | |
214 7 | |
11 12 7 13 176 23 191 |
2. 题目分析
因为蚂蚁的数量可能会众多,爬行的方式会有非常多种,所以我们没有办法通过一一列举的方式来解决这道题目。
如果我们假设蚂蚁在爬行的过程中即使相遇了也不理睬对方而继续走自己的路,那么所有蚂蚁掉落时间就只有两个取值了,一个为向左走的时间,一个为向右走的时间。由此我们可以知道,最早时就是每只蚂蚁掉落的最小时间,最大值就是每只蚂蚁掉落的最大时间。
3. 代码实现
#include<iostream>
using namespace std;
int c, big, little,k, L, n;
int main()
{
cin >> c;
while (c--&&(cin>>L>>n))
{
big = little = 0;
for (int i = 0; i < n; i++)
{
cin >> k;
if (k>big)
big = k;
if (L - k > big)
big = L - k;
if (k > L - k)
k = L - k;
if (k > little)
little = k;
}
cout << little << " " << big;
}
if (c == -1)
cout << endl << "missing input" << endl;
}
后记
好的,这篇文章我们就分享到这里,希望对大家有所帮助,下期见。