奖励铅笔-第13届蓝桥杯国赛Python真题解析

文摘   教育   2024-07-09 20:46   湖北  

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第95讲。

奖励铅笔,本题是2022年5月29日举办的第13届蓝桥杯青少组Python编程国赛真题编程部分第4题。题目要求根据N名同学的成绩,请编程计算最少需要奖励的铅笔数,要求每名同学至少奖励一支铅笔,同时要确保相邻的同学中,成绩高的同学奖励的铅笔更多。

先来看看题目的要求吧。

01
题目说明 

时间限制:3000MS

内存限制:589824K8

编程实现:

老师要奖励N名成绩优秀的同学,首先N名同学按随机顺序排成一排,且每名同学都对应一个成绩(成绩各不相同),然后按照如下规则进行奖励。

规则:

1).每名同学至少奖励1支铅笔;

2).每一名同学拿到铅笔后,都会和左右相邻的同学作比较,如果相邻的同学成绩比自己高,那么铅笔数也一定比自己多,如果相邻的同学成绩比自己低,那么铅笔数一定比自己少。(注意每个人成绩都不同)

当给出要奖励的同学数N,及N名同学的成绩及排序位置,请你按照规则帮助老师计算出最少需要奖励多少支铅笔。

例如:

当N=3,3名同学的成绩分别为:91,92,94。

如果3名同学的排序为:91,94,92,最少需要奖励4支铅笔(成绩为91的同学1支,成绩为94的同学2支,成绩为92的同学1 支);

如果3名同学的排序为:91,92,94,最少需要奖励6支铅笔(成绩为91的同学1支,成绩为92的同学2支,成绩为94的同学3 支)。

输入描述:

第一行输入一个正整数N,表示要奖励的同学数

第二行输入N个正整数,每个正整数表示一名同学的成绩(成绩各不相同),正整数之间以一个英文逗号隔开,正整数的顺序即代表学生的排序

输出描述:

输出一个整数,表示N名同学最少需要奖励的铅笔数

样例输入:

3

91, 94, 92

样例输出:

4

评分标准:

  • 10分:能正确输出一组数据;

  • 10分:能正确输出两组数据

  • 20分:能正确输出三组数据

  • 20分:能正确输出四组数据。
02
思路分析 

这是一道算法题,涉及的知识点包括循环、条件、列表和贪心算法等。

分糖果是一道经典的贪心算法题,还是有一定难度的。
运用贪心思想来解决这个问题还是比较容易想到的,奖励给每个同学的铅笔能少则少,只要确保不比低分的邻居少就行。
这里的难点就在于每个同学都有左邻居和右邻居(首尾两人除外),既受左边同学的影响,又受右边同学的影响。
既然同时处理起来比较麻烦,可以尝试着分开处理,先从左到右处理一遍,再从右到左处理一遍。
为了更好地理解这一过程,我们可以从一些特殊的数据入手,逐一讨论。
假设有5名同学,其分数依次是:
score = [92, 93, 94, 96, 98]
可以先定义一个列表用来表示奖励每个孩子铅笔的数量,由于每个孩子至少奖励一支铅笔,默认值都为1,如下:
pencil = [11111]
然后从左到右,依次处理,由于右边同学的分数都大于左边,所以每个同学奖励的铅笔数量都等于左边同学的铅笔数 + 1,因此最终奖励的铅笔数量如下:
pencil = [12345]
再来看第二种情况,假设5名同学的分数依次是:
score = [969594, 93, 90
仍然是先定义pencil列表如下:
pencil = [1, 1, 1, 1, 1]
这一次,我们选择从右到左依次处理,最终奖励的铅笔数量如下:
pencil = [54321]
我们再来看第三种情况,假设5名同学的分数依次是:
score = [9298969593
先定义pencil列表如下:
pencil = [1, 1, 1, 1, 1]
然后从左到右处理,如果右边的分数大于左边,就将右边的铅笔数量设置为左边的铅笔数量 + 1。
所以,依次要更新第2名同学和第4名同学的铅笔数量,如下:
pencil = [12111
接着从右到左处理,如果左边的分数大于右边,并且其铅笔数量 <= 右边铅笔数量,就将左边的铅笔数量设置为右边的数量 + 1。
所以,依次要更新第4、第3、第2名的3位同学,结果如下:
pencil = [14321]
最后只需要统计pencil列表中的铅笔总数量,就可以了。

思路有了,接下来,我们就进入具体的编程实现环节

03
编程实现 
根据上面的思路分析,我们编写程序如下:

代码不多,强调3点:

1). 从左到右遍历时,最后一个不用向右比较,所以range()函数中的值是n - 1;

2). 从右到左遍历时,第一个不用向左比较,所以range()函数中的值是(n - 1, 0, -1);
3). 从右到左遍历时,有两个条件,一是左边的分数较大,二是左边的铅笔数少(包括相等),二者缺一不可。
至此,整个程序就全部完成了,你可以输入不同的数据来测试效果啦。
04
总结与思考 
本题代码在10行左右,涉及到的知识点包括:
  • 循环语句;

  • 条件语句;

  • 列表;

  • 贪心算法;

这是本次国赛的第4题,本题分值为60分,代码不多,但难度较大。关键点有两个,一是对于贪心思想的理解和运用,二是利用计算思维将复杂问题拆分成两个简单问题,然后注意解决。

贪心思想比较容易想到,也比较好理解,难就难在贪心算法没有固定的模型和结构,需要具体问题具体分析。

分糖果是一个非常经典的案例,著名的LeetCode网站上也有这道题,题号是135,难度级别为困难,有兴趣的也可以去看一看。

你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。

如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄

需要源码的,可以添加本人微信

另外,超平老师创建了一个蓝桥杯备考交流群,这是专门为老师和家长打造的免费社群,您可以与来自全国各地的老师、家长共同交流经验,分享学习心得。

超平老师也会给大家带来及时的赛事动态,备考攻略,真题资源分享,帮助各位更好备考第15届蓝桥杯赛事,力争取得优异的成绩。

扫码或长按加入微信群

超平的编程课
青少儿编程教育专家,中国人民大学硕士,大学讲师,曾任知名上市机构金牌讲师,16年编程教研经验。大耳猴少儿编程联合创始人,致力于通过编程教育提升孩子的逻辑思维、数学思维和计算思维,迎接AI时代。
 最新文章