(算法练习)——201712-2游戏(CCF模拟)

这一题和之前在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;
	
}
发布了212 篇原创文章 · 获赞 6 · 访问量 6385

猜你喜欢

转载自blog.csdn.net/weixin_42377217/article/details/104339914
今日推荐