解题思路:

其实我们研究的对象是兔子的末状态,所以不必把兔子移动过程展现出来。

选用指针来表示兔子的移动方向,首先先确定两只“双向奔赴"兔子的位置,单向奔赴兔子的末位置与指向的兔子一样,用深搜扫一下就行,这里我用的是C语言,时间复杂度为O(nlogn),能力有限,不会优化了,大家凑合看看。

注意事项:
但是这里要注意一点第一只兔子指向第二只兔子,最后一只兔子指向倒数第二只兔子
参考代码:

#include<stdio.h>  

#include<stdlib.h>  

struct member{  

    int opp;                        //兔子初始位置  

    int index;                    //记录输入顺序  

    int u;                        //判断是否被“扫”过  

    struct member *place;  

};   

  

int ans[1000005];  

struct member m[1000005];  

  

 int cmp(const void *x,const void *y){  

    struct member xx = *(struct member*)x;  

    struct member yy = *(struct member*)y;  

    return xx.opp-yy.opp;  

}  

  

void des(struct member *a){                                    //递归深搜  

      

    if((*(a->place)).u==0){  

        des(a->place);  

    }  

    ans[a->index]=ans[(*(a->place)).index];  

    a->u=1;  

}  

  

  

int main(){  

      

    int n;  

    scanf("%d",&n);  

  

    for(int i=0;i<n;i++){  

        scanf("%d",&ans[i] );  

        m[i].opp =ans[i];  

        m[i].index=i;  

        m[i].u=0;  

    }  

  

    qsort(m,n,sizeof(m[0]),cmp);              // 排序  

      

    m[0].place =&m[1];                                  //对兔子指针进行处理  

    m[n-1].place =&m[n-2];  

    for(int i=1;i<n-1;i++){  

        if(m[i+1].opp-m[i].opp <m[i].opp -m[i-1].opp ){  

            m[i].place =&m[i+1];  

        }else{  

            m[i].place =&m[i-1];  

        }  

    }  

      

    for(int i=0;i<n-1;i++){                                              //优先确定“双向奔赴”兔子的末位置  

        if((m[i].place==&m[i+1])&&(m[i+1].place==&m[i])){  

            ans[m[i].index]=ans[m[i+1].index]=(m[i].opp+m[i+1].opp)/2;  

            m[i].u=m[i+1].u=1;  

        }  

    }   

      

    for(int i=0;i<n;i++){  

        if(m[i].u==0){  

            des(&m[i]);  

        }  

    }  

  

    for(int i=0;i<n;i++){  

        printf("%d ",ans[i]);  

    }  

  

    return 0;  

}  




点赞(1)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论