解题思路:
先对照代码过一遍思路:
首先定义一个数组队列:
第一步,定义一个数组,大小尽量大(后面会解释),初始化为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分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复