蚂蚁
目录
题目描述
n只蚂蚁以每秒1cm的速度在长为Lcm的竿子上爬行。当蚂蚁爬到竿子的端点时就会掉落。由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反向爬回去。对于每只蚂蚁,我们知道它距离竿子左端的距离xi,但不知道它当前的朝向。请计算所有蚂蚁落下竿子所需的最短时间和最长时间。
输入格式
第一行一个整数L
第二行一个整数n
第三行n个整数xi,表示蚂蚁的位置
输出格式
一行两个整数,分别表示落下的最短时间和最长时间
输入输出样例
输入 #1
10 3 2 6 7
输出 #1
4 8
说明/提示
1<=L<=100000,1<=n,xi<=L
解题思路
目标
求蚂蚁落下杆子的最短时间和最长时间
分析
一、对于最短时间,我们可以考虑当所有蚂蚁都向(以中线为界)最近的端点移动时,这时不会发生两只蚂蚁相碰的情况,也就是时间最短的情况。
对于最长时间,你也许会想蚂蚁有向左向右两种情况,相碰之后又向相反的方向移动,n只蚂蚁就有2n种可能,要考虑的情况就会特别多,而随n的增大急剧增加。但两只相同的蚂蚁相遇时,他们的位置是相同的,可以看成两只蚂蚁的移动方向没有发生改变(相当于蚂蚁一变成蚂蚁二,蚂蚁二变成蚂蚁一)没有由于相遇时相互反向移动且速度相同,我们可以认为是依原方向移动。
我们其实只用考虑他们初始位置里两个端点的距离,然后最短时间是,初始位置到达两个端点的距离较短里面的最大值,这时候可以确保所有蚂蚁掉落,而最长时间是蚂蚁到达两个端点的距离较长里面的最大值。
1、定义两个int整型的变量l和n,l保存杆长,n保存蚂蚁的数量,并定义定义一个int整型的数组a[100005]用来保存每一只距离竿子左端的距离,然后输入l和n。
2、使用一个循环n次的for循环依次输入n只蚂蚁距离竿子左端的距离a[i]。
3、定义两个int整型的变量a1、a2,分别用来保存蚂蚁落下杆子的最短时间和最长时间,初始值赋为0。
4、使用一个循环n次的循环依次去判断每一只蚂蚁初始位置到达两个端点的距离较短里面的最大值和到达两个端点的距离较长里面的最大值。
5、最后输出a1和a2,并使用空格隔开。
代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int l,n,a1=0,a2=0,a[100005];
cin >> l >> n;
for(int i=0; i<n; i++){
cin >> a[i];
}
for(int i=0; i<n; i++){
a1=max(min(l-a[i],a[i]),a1);
a2=max(max(l-a[i],a[i]),a2);
}
cout << a1 << " " << a2;
return 0;
}