[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第94讲。
先来看看题目的要求吧。
时间限制:3000MS
内存限制:589824K8
编程实现:
某班级男生人数为X人,女生人数为Y人,现全班同学围成一个圆圈,并按照顺时针方向为每名同学编号(从1到X+Y)。
现给出一个正整数K[ 2 < K <(X + Y)],从编号为1的同学开始顺时针方向报数,报到K的同学退出圆圈,下一名同学继续从1报数,再次报到K的同学退出圆圈。如此循环,直到剩余人数为X时游戏结束。
请你计算出游戏开始时X名男生分别应该排在什么位置,才能保证每次离开的都是女生,游戏结束时剩余X人都是男生,并将游戏开始时每名男生的位置编号按照从小到大的顺序输出。
例如:X = 5,Y = 3,K = 3,8名同学按照如下顺序排列,可以使3轮报数过后最后剩余的5名同学都为男生(蓝色为男生位置,红色为女生位置)。
故5名男同学的编号分别为2, 4, 5, 7, 8。
输入描述:
输入三个正整数,X, Y, K(3 ≤ X ≤ 100,3 ≤ Y ≤ 100,2 ≤ K ≤ (X + Y)),X表示男生,Y表示女生,报数为K的同学退出圆圈,三个正整数之间以一个空格隔开
输出描述:
将每名男生位置编号按照从小到大的顺序输出,编号之间以一个空格隔开
样例输入:
5 3 3
样例输出:
2 4 5 7 8
评分标准:
10分:能正确输出一组数据;
10分:能正确输出两组数据;
15分:能正确输出三组数据
15分:能正确输出四组数据。
这是一道简单的算法题,涉及的知识点包括循环、条件、列表和模拟算法等。
列表模拟法 队列模拟法
['男','男','男','男','男','男','男','男']
['女','男','女','男','男','女','男','男']
队列是指一种特殊的列表,其特殊之处在于它只允许队头进行删除操作,通常称为出队,而在队尾进行插入操作,通常称为入队。
[1, 2, 3, 4, 5, 6, 7, 8]
[2, 3, 4, 5, 6, 7, 8, 1]
[3, 4, 5, 6, 7, 8, 1, 2]
[4, 5, 6, 7, 8, 1, 2]
[5, 6, 7, 8, 1, 2, 4]
[6, 7, 8, 1, 2, 4, 5]
[7, 8, 1, 2, 4, 5]
[8, 1, 2, 4, 5, 7]
[1, 2, 4, 5, 7, 8]
[2, 4, 5, 7, 8]
思路有了,接下来,我们就进入具体的编程实现环节。
列表模拟法
队列模拟法
1. 列表模拟法
根据前面的思路分析,我们编写代码如下:
代码不少,说明3点
1). i表示第几个人,初始值从1开始,因此在访问列表时,需要使用i -1;
2). num表示要报的数字,初始值为0,循环时,先将num加1,表示要报的数字,如果数字等于k,则表示该位置应该是女生,修改元素,同时将y减1,num重新设置为0;
3). 第16行注释的代码,可以打印出每个人报的数字,你可以加上,方便测试和查看效果。
2. 队列模拟法
根据前面的分析,编写代码如下:
代码不多,强调4点:
1). 这里使用的是队列的思想,但仍然使用列表来模拟实现,你也可以直接使用队列deque;
2). 由于要报的数字在1 ~ k之间,因此这里使用了取模运算符%;
3). 如果报到数字k,说明是女生,直接将这一项删除,这里的pop(0)就表示删除第一项,也就是所谓的队头元素,如果没有报到数字k,说明是男生,将这一项移到队尾;
4). 最后得到的列表,顺序可能不是从小到大,因此需要使用sort函数排序。
循环语句;
条件语句;
列表操作;
输入输出;
这是本次国赛的第3题,分值为50分,难度中等,关键是如何使用程序来模拟循环报数的过程,尤其是要处理好细节。
Python中的列表是一个动态数组,你可以在任意位置进行插入、删除和访问元素。同时还提供了大量的方法(函数),可以模拟各种数据结构,比如栈、队列,链表等,功能十分强大,一定要熟练掌握。
超平老师给你留一道思考题,如果使用队列deque来实现队列操作,代码该如何实现呢?
你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。
需要源码的,可以添加本人微信。
另外,超平老师创建了一个蓝桥杯备考交流群,这是专门为老师和家长打造的免费社群,您可以与来自全国各地的老师、家长共同交流经验,分享学习心得。
超平老师也会给大家带来及时的赛事动态,备考攻略,真题资源分享,帮助各位更好地备考第15届蓝桥杯赛事,力争取得优异的成绩。
扫码或长按加入微信群