解题思路:

先对照代码过一遍思路:


首先定义一个数组队列:

第一步,定义一个数组,大小尽量大(后面会解释),初始化为0(习惯)。

第二步,给前n个元素编号为1,2,3……相当于给n个玩家编号。

第三步,定义两个指针front和rear,front=0表示front指向队首,rear=n-1表示rear指向队尾。


此时数组队列已定义完毕。

那我们要怎么模拟数到3的人退出队列呢?

很简单,只要在遍历队列时每遍历两个就跳过一个即可。

那我们怎样保留数1和数2的玩家呢?

也很简单,比如front=0的人编号为1,我们把他放到队尾,同时记得移动队尾和队首,即a[++rear]=a[front++];

最后执行循环到队列只剩下一个元素就能得出答案了。


注意事项:


使用顺序队列要求数组大小足够大,如果想占用尽可能小的空间实现队列功能可以构造循环队列,即rear指向数组的最后一个内存空间时,rear-=len-1;

参考代码:


#include<stdio.h> 

int main(){

    int a[1000];            //尽量大

    int front,rear,n;

    scanf("%d",&n);

    rear=n-1;front=0;

    int i=0;

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

          a[i]=i+1;            //定义队列 

    while(rear>front){

        a[++rear]=a[front++];

        a[++rear]=a[front++];

        front++;

    }                              //循环结束时rear=front,表示该队列此时只有一个元素 

    printf("%d",a[rear]);

}


点赞(0)
 

0.0分

1 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论