解题思路:
先对照代码过一遍思路:
首先定义一个数组队列:
第一步,定义一个数组,大小尽量大(后面会解释),初始化为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分
2 人评分
三角形 (C++代码)递归(存在大量重复计算,容易出现时间超限)浏览:836 |
DNA (C语言代码)浏览:564 |
核桃的数量 (C语言代码)浏览:726 |
1024题解浏览:879 |
C二级辅导-同因查找 (C语言代码)浏览:618 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:560 |
简单的a+b (C语言代码)浏览:676 |
顺子浏览:1369 |
陶陶摘苹果 (C语言代码)浏览:608 |
永远的丰碑 (C++代码)浏览:815 |