金箍棒高度-第12届蓝桥杯国赛Python真题解析

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

金箍棒高度,本题是2021年5月29日举办的第12届蓝桥杯青少组Python编程全国总决赛真题编程部分第5题。题目要求对给定的N个金箍棒的初始高度,请你编程帮助孙悟空计算一下至少手指几次可以让N个金箍棒高度都一样。

先来看看题目的要求吧。

一.题目说明

编程实现:

孙悟空的金箍棒可以变高也可以变矮还可以变出多个金箍棒。

这天孙悟空无聊变出了N个长短不一的金箍棒,这些金箍棒之间相互吵闹,攀比谁高。

当孙悟空每次手指其中一个金箍棒时,这个金箍棒高度不变,其他的金箍棒高度都会增加1。

只有当所有金箍棒高度都一样时,他们之间才不相互吵闹,也不会再增加高度,保持静止。

分别给定N个金箍棒的初始高度,请你帮助孙悟空计算一下至少手指几次可以让N个金箍棒高度都一样。

例如: 有3个金箍棒,初始高度分别为2,3,4。

第一次手指第三个金箍棒,第三个金箍棒高度不变,第一和第二个金箍棒高度分别增加1,变为3,4,4;

第二次手指第二个金箍棒,第二个金箍棒高度不变,第一和第三个金箍棒高度分别增加1,变为4,4,5;

第三次手指第三个金箍棒,第三个金箍棒高度不变,第一和第二个金箍棒高度分别增加1,变为5,5,5;

这时3个金箍棒的高度都为5,手指3次后金箍棒高度一样。所以至少手指3次才能使金箍棒高度都一样。

输入描述:

输入N个非全部相等的正整数(N个数不全部相等,2 < N < 31),且之间以英文逗号隔开,分别表示N个金箍棒的初始高度

输出描述:

输出一个正整数,表示至少手指几次才能使金箍棒高度都一样

样例输入:

2,3,4

样例输出:

3

二.思路分析

这是一道简单的算法题,考查的知识点主要包括循环、列表和贪心算法等。

题目的描述比较长,但场景比较简单,对于N根金箍棒,每一次只有一根金箍棒的高度保持不变。

我们应该选择哪一根金箍棒呢?

是最短的,还是最长的,或者是随机选择一根金箍棒呢?

很显然,为了确保次数最少,应该选择最长的,其实这就是贪心算法的思想。

贪心算法,又称贪婪算法,英文名greedy algorithm,其核心思想是在对问题求解时,总是做出在当前看来是最好的选择。

贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择得到全局最优的解决方案。

因此,我们需要对所有的金箍棒的高度进行排序,然后将前面的 n - 1个高度分别加1。

然后重复这个过程,当所有的金箍棒高度都相同时,结束循环。

如何判断列表中的所有高度都一样呢?

方法比较多,最常用的有如下两种:

  • 使用count()函数统计第一项的个数,并和列表长度进行比较;

  • 将列表转成set集合,并判断set的长度;

很显然, 使用第二种方法更为简单,在Python编程中,set是一个无序且不包含重复元素的数据类型。

由于set不包含重复元素,所以它经常被用来进行去重操作,或者检查某个元素是否存在于某个集合中。

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

三.编程实现

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

代码不多,说明3点:

1). 在获取输入的高度时,使用了列表推导式的编程技巧,注意需要转成整型;

2). while循环中,将heights列表转成集合,再判断set的长度,如果长度 > 1,说明金箍棒的高度不一致,注意heights列表本身没有去重;

3). 每一次排序后,只对前面n - 1个列表项加1,最后一项保持不变。

至此,整个程序就全部完成了,你也可以输入不同的数字来测试效果啦。

四.总结与思考

本题代码在10行左右,涉及到的知识点包括:

  • 循环语句;

  • 列表的使用;

  • 排序函数;

  • set集合;

  • 贪心算法;

本题难度中等,关键点有两个,一是对贪心算法的理解和运用,二是熟悉sort()函数和set集合的用法。

贪心算法的思想其实比较简单,理解起来也比较容易,因为在某种程度上来说,我们每个人都会生活中运用贪心算法。

在使用贪心算法时,难点在于如何正确地定义“贪心策略”以及如何确保该策略能够导致全局最优解或接近全局最优解。

同时还需要注意,贪心策略并不总是能够找到全局最优解,因为贪心算法通常不考虑未来可能的更优选择。

超平老师给你留一道思考题,如果不排序,每次将最大高度找出来,然后遍历heights列表,将不是最大高度的列表项加1,是否可行呢,为什么?

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

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

需要源码的,可以移步至”超平的编程课“gzh。

  • 24
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值