POJ - 1852 Ants

这题只要有想象力就能很简单过

题意:
一根n厘米长的线上有多只蚂蚁,蚂蚁顺着线走,但方向不知道,如果两只蚂蚁碰到一起就都掉头然后继续前进直到从线的两端掉下。蚂蚁每次移动的速度为1cm/s 。要求输出所有蚂蚁都掉下去需要用的最短时间和最长时间

思路:

  • 时间最短:如果所有蚂蚁都不会互相碰到一起就不会额外产生多余的步数,则以线长度的中值为界,左边的都往左走,右边的都往右走,这样所有蚂蚁都不会碰到一起而且每只蚂蚁走的时间都是最短的。所以时间最短的只需要看离中值最近的一只蚂蚁要走的时间即可
  • 时间最长:任意两只蚂蚁碰到一起后掉头再继续行走,可以想象无视掉头,不用刻意考虑具体哪一只蚂蚁是怎样走的,碰到一起后因为两只蚂蚁所走的路之和是不变的,则不用考虑掉头,蚂蚁继续往前走直到端点,仍然以线长度的中值为界,左边的都往右走,右边的都往左走,这样每一只蚂蚁都走了最长的距离也就是最费时间的。所以时间最长的只需要看离中间值最远(离端点最近)的一只蚂蚁要走的时间即可

完整代码如下:

#include<stdio.h>
int main() {
    int t ;
    int len, num, mid ;
    int minL, minR, maxL, maxR ;
    int data[1000500] ;
    scanf("%d", &t) ;
    while(t--) {
        scanf("%d%d", &len, &num) ;
        mid = len / 2 ;                 //线长度的中间值
        minL = minR = maxR = 0 ;      
        maxL = 99999999 ;
        for(int i=0; i<num; i++) {
            scanf("%d", &data[i]) ;
            if(data[i] < maxL)          //找离左端点最近的点
                maxL = data[i] ;
            if(data[i] > maxR)          //找离右端点最近的点
                maxR = data[i] ;
            if(data[i]>mid && (len-data[i])>minR)   //找中值右边离中值最近的点
                minR = len - data[i] ;
            if(data[i]<=mid && data[i]>minL)  //找中值左边离中值最近的点
                minL = data[i] ;
        }
        printf("%d %d\n", (minL>minR ? minL:minR), ((len-maxL)>maxR ? (len-maxL):maxR)) ; //输出离中值最近的点和最远的点
    }
    return 0 ;
}

总结:
拿到这样的模拟题,不要急着死板的按照题目的要求一步一步做,这种题肯定不后让你用很复杂的方式来解决一定都有巧妙地地方,多想象,多画图,灵活一点。也可以观察样例,本题的样例是:

输入
214 7
11 12 7 13 176 23 191
输出
38 207

样例中最小时间就是线的长度214减去最接近中值的176的答案,最大时间就是线的长度214减去离中值最远的11的答案。我做题的时候就是凭感觉按照这样的思路慢慢摸索出来,这样的方式有一定的偶尔性但有时候还是会提供一点灵感

发布了21 篇原创文章 · 获赞 51 · 访问量 3202

猜你喜欢

转载自blog.csdn.net/weixin_44689154/article/details/100020390