HAUT OJ 1453: 勤劳的蚂蚁和聪明的你

问题描述:

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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值