这一题和之前在C语言网上的一题很相似,循环报数,传送门:
(算法练习)——循环报数问题
循环报数问题要求:
1、给定数字是3,到3就出队,看最后剩下的人编号
2、这是循环报数,即1,2,3,1,2,3这样报数
本题要求:
1、任给学生人数、数字,这个很好办,因为计算方式都是一样的
2、这是人数循环,但数字不循环,即在有限的人里,1,2,3,4,5这样依次报数下去
处理方式:
这种问题用队列真的非常方便,不同之处在于,这一题的队列有标记的功能,即学生就这么多人,他们是不断重复报数的,如果这个人报的数不会被舍,那个这个人的队列数字就放到队尾,如果被舍了,这个人的队列数字直接出队,在这个过程中,增加一个cnt (初始为1),每次++,就可以了
经过最近对CCF1,2题的练习,感觉CCF的第二题似乎倾向于栈、队列、hash表这些的使用
AC代码:
#include <stdio.h>
#include <queue>
#include <algorithm>
using namespace std;
int main(){
int n,k;
scanf("%d %d",&n,&k); //n为人数,k为标志数
int cnt = 1;
queue<int>q;
for(int i = 1;i <=n;i++){
q.push(i); //n个小朋友入队列
}
while(!q.empty()){
if(q.size() == 1){ //q中只剩1个元素,输出
printf("%d",q.front());
q.pop();
}
else{
if(cnt % k == 0 || cnt % 10 == k){ //看cnt,也就是轮到这个人报的数是不是该舍
q.pop();
}
else{
q.push(q.front()); //未舍弃,放到队尾,继续查看下一次她对应的cnt是否满足
q.pop();
}
}
cnt++; //cnt每次+1
}
return 0;
}