POJ1852 Ants

题目来源:点击打开链接

Description

An army of ants walk on a horizontal pole of length l cm, each with a constant speed of 1 cm/s. When a walking ant reaches an end of the pole, it immediatelly falls off it. When two ants meet they turn back and start walking in opposite directions. We know the original positions of ants on the pole, unfortunately, we do not know the directions in which the ants are walking. Your task is to compute the earliest and the latest possible times needed for all ants to fall off the pole.

Input

The first line of input contains one integer giving the number of cases that follow. The data for each case start with two integer numbers: the length of the pole (in cm) and n, the number of ants residing on the pole. These two numbers are followed by n integers giving the position of each ant on the pole as the distance measured from the left end of the pole, in no particular order. All input integers are not bigger than 1000000 and they are separated by whitespace.

Output

For each case of input, output two numbers separated by a single space. The first number is the earliest possible time when all ants fall off the pole (if the directions of their walks are chosen appropriately) and the second number is the latest possible such time. 

Sample Input

2
10 3
2 6 7
214 7
11 12 7 13 176 23 191

Sample Output

4 8
38 207

很多的蚂蚁都在长度为L(cm)的膀子上爬行,它们的速度都是1cm/s,到了棒子终端的时候,蚂蚁就会掉下去。如果在爬行途中遇到其他蚂蚁,两只蚂蚁的方向都会逆转。已知蚂蚁在棒子的最初位置坐标,但是我们不知道他们会往哪一个方向爬。请求出所有蚂蚁掉下去的最短时间和最长时间

题目分析:最容易想到的枚举所有蚂蚁的初始朝向的组合。每只蚂蚁的朝向都有2种可能,n只就是2^n种,由题意可知蚂蚁数的上限为2^1000000,显然纯暴力行不通

如果只有两只的话,那么最短时间就是两只蚂蚁距离两端点距离较小的距离中取大者就是所需最短时间,而最长时间就是两只蚂蚁距离两端点距离较大者中取大者就是所需最长时间,例如,长度为10,一只在距离左端2的位置,一只在距离左端6的位置,则最短时间为max(min(2,10-2),min(6,10-6))为4,最长时间为max((max(2,10-2),max(6,10-6)))为8其实就是两只相向而行,当相遇后,都转为逆向,则时间为从相遇点到端点距离大者与相遇前所需时间,分析实际就是2到10的距离,当蚂蚁数量增加时,情况相同 这样的时间复杂度是O(n) 

include <iostream>  
#include <cstring>  
#include <cstdio>  
using namespace std;  
  
int main()  
{  
    int testcase;  
    cin>>testcase;  
    while(testcase--)  
    {  
        int maxres=0,minres=0;  
        int L,totalants,tmp;  
        cin>>L>>totalants;  
          
        for(int i=0;i<totalants;i++)  
        {  
            scanf("%d",&tmp);  
            if(tmp>maxres)  
                maxres=tmp;  
            if(L-tmp>maxres)  
                maxres=L-tmp;  
            if(L-tmp<tmp)  
                tmp=L-tmp;  
            if(tmp>minres)  
                minres=tmp;  
        }  
        cout<<minres<<" "<<maxres<<endl;  
    }  
    return 0;   
}  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值