问题描述:
n 只蚂蚁以每秒 1 cm的速度在长为 L cm的水平竿子上爬,当蚂蚁爬到竿子的端点时就会掉落。由于竿子很细,不允许蚂蚁在上面并行,也就是说当两只蚂蚁迎面相遇时,只能调头向各自相反的方向爬行。对于每个蚂蚁,我们只知道它距离竿子最左端的距离Xi , 不清楚它当前的方向。聪明的你能否计算出所有蚂蚁落下竿子所需的最短时间和最长时间。 输入:
第一行输入两个整数L (竿长),n(小蚂蚁的个数)
第二行输入n个整数X,Xi 为第 i 个蚂蚁距竿子最左端的距离
输出:
输出占两行,第一行输出最短时间,且在结果前加上”min = “,最大值同理
样例输入:
10 3 2 6 7
样例输出:
min = 4 max = 8
原因分析:
最短时间 以L/2为分界线,左边部分的蚂蚁方向朝左,右半部分朝右,因为蚂蚁速度都一样,所以不会相碰,算出各只蚂蚁最小的时间,再求其中的最大值即可
最长时间 (考虑相遇掉头的情况)假如两只蚂蚁相碰,左碰右后,左蚂蚁(掉头朝左),右蚂蚁(掉头朝右),相当于左蚂蚁仍朝右,右蚂蚁仍朝左,即两只互相穿插过去,由此可计算出蚂蚁距端点最大的时间(即到较远的端点的时间),然后再求出时间中的最大值.
解决方案:
#include<iostream>
#include<cstdlib>
#include<algorithm>
using namespace std;
int main()
{
int L,n;
double pos;
cin>>L>>n;
double minT=0,maxT=0;
for(int i=0;i<n;i++)
{
cin>>pos;
double temp=min(pos,L-pos);
minT=max(minT,temp);
temp=max(pos,L-pos);
maxT=max(maxT,temp);
}
cout<<"min = "<<minT<<endl;
cout<<"max = "<<maxT<<endl;
return 0;