题目大意:在一根极细的杆子上,有许多蚂蚁在爬,他们爬的方向未知(有可能是右边,也有可能是左边)。若碰到杆子的两端他们便会掉落。如果他们相遇,由于杆子太细,他们不能越过对方过去,只能掉头回去。问所有蚂蚁掉落杆子所需的最短时间与最长时间。

 

分析:由于这题数据很大,搜索肯定会超时。换一种思路,如果他们都是同方向,那么久不存在最短时间。所以,当他们相遇时,他们之前所用时间相同,相遇的位置是同一点。之后的掉头可看成是两只蚂蚁交错(即越过对方),效果是一样的。这样只需查找每只蚂蚁到杆子两端的最长时间与最短时间便可。

#include<iostream>
#include<stdio.h>
#include<math.h>
#define INT 0x3f3f3f3f
using namespace std;

int main(){
    int t;
    cin>>t;
    while(t--){
        int l,n;
        scanf("%d %d",&l,&n);
        int a[100000];
        int mint=0;
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
            mint=max(mint,min(a[i],l-a[i]));
        }
        int maxt=0;
        for(int i=0;i<n;i++){
            maxt=max(maxt,max(a[i],l-a[i]));
        }
        printf("%d %d\n",mint,maxt);
    }
}

 

 

poj-problem01

 posted on 2019-04-02 21:25  qmzhna  阅读(70)  评论(0编辑  收藏  举报