小马搬运物品-第13届蓝桥杯省赛Python真题精选

news2024/11/26 13:54:15

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

小马搬运物品,本题是2022年4月23日举办的第13届蓝桥杯青少组Python编程省赛真题编程部分第4题,13届一共举办了两次省赛,这是第二次省赛。题目要求编程计算小马将N件物品从河的一岸搬运到河的另一岸一共有多少种方案。

先来看看题目的要求吧。

一.题目说明

时间限制:3000MS

内存限制:589824K8

编程实现:

小马需要将N件物品从河的一岸搬运到河的另一岸,每次搬运的物品为1到3件。请问小马将N件物品全部搬运过去有多少种方案。

例如:N = 3,将3件物品全部搬运过去有4种方案:

方案一:第一次搬运1件,第二次搬运1件,第三次搬运1件;

方案二:第一次搬运1件,第二次搬运2件;

方案三:第一次搬运2件,第二次搬运1件;

方案四:一次搬运3件。

输入描述:

输入一个正整数N,表示需要搬运的物品数

输出描述:

输出将N件物品全部搬运过去有多少种方案

样例输入:

3

样例输出:

4

评分标准:

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

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

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

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

二.思路分析

这是一道经典的算法题,涉及的知识点包括循环、条件、列表、递归、动态规划等。

看完题目描述,你脑海里首先想到的是什么呢?

如果你想到的是斐波那契数列,那么恭喜你,这道题基本上就可以拿下了。

图片

实际上,这是斐波那契数列的变种问题。

对于经典的斐波那契数列来说,每一项(第1项和第2项除外)都只和前面的两项有关系,即:

f(n) = f(n - 1) + f(n - 2)

本题中小马的搬运方案,每一项(前面3项除外)都和前面的三项有关系,如下:

f(n) = f(n - 1) + f(n - 2) + f(n - 3)

这是怎么推导出来的呢?

对于这种具有递推性质的问题,通常只需要考虑最后一步是如何计算的,就可以迅速的确定推导公式。

我们使用f(n)表示搬运n件物品的方案数量,最后一次到底搬运几件物品呢?

可以分3种情况讨论:

  • 搬运3件物品,那么搬运n - 3件物品的方案数为f(n - 3);

  • 搬运2件物品,那么搬运n - 2件物品的方案数为f(n - 2);

  • 搬运1件物品,那么搬运n - 1件物品的方案数为f(n - 1);

根据加法原理,当完成一件事情有n种不同的方式,且这些方式之间互不影响,那么完成这件事情的总方法数就是各类方式中的方法数之和。

因此,总的方案数量f(n)就等于f(n - 1) + f(n - 2) + f(n - 3)。

对于斐波那契数列及其变种这类问题,通常有如下三种解决方案:

  • 递归算法

  • 动态规划

  • 递推算法

不管使用哪一种思路,都需要单独考虑边界问题,对于本题而言,需要考虑前3项。

如果只有一件物品,毫无疑问只有一种方法,即f(1) = 1。

如果有两件物品,可以一次搬运两件,也可以分两次,每次搬运一件,所以一共有两种方案,即f(2) = 2。

如果有三件物品,可以每次搬运一件,分3次搬运,也可以一次搬运3件,还可以第一次搬运1件,第二次搬运2件,又或者是第一次搬运2件,第二次搬运1件,一共有4种方案,即f(3) = 4。 

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

三.编程实现

根据上面的思路分析,我们分别使用3种方案来编写程序:

  • 递归算法

  • 动态规划

  • 递推算法

1. 递归算法

递归算法的重点是定义递归函数,代码如下:

图片

代码比较简单,但是随着n的增加,代码运行的时间会越来越长,效率会急剧下降。

其原因在于存在大量重复的计算,可以增加一个备忘录将每一次的计算结果保存起来,避免重复计算。

使用带备忘录的递归代码如下:

图片

代码不多,强调一点,这里的memo列表就是备忘录,前3项不需要保存,从第4项开始保存,对应于memo[4]。

有了备忘录,算法效率大大提高。

2. 动态规划

这里的推导公式(状态转移方程)和初始状态都已经确定好了,代码就比较简单了,如下:

图片

代码并不多,说明4点:

1). 这里定义函数f(n)用于计算搬运n件物品的方案数量,主要是为了方便处理边界条件,但它不是递归函数;

2). Python支持多变量赋值运算,因此可以直接写成dp[1], dp[2], dp[3] = 1, 2, 4,代码看起来更加紧凑;

3). 在循环计算的时候,从第4项开始,所以range()函数的起点是4;

4). dp列表的最后一项就是要计算的方案数量,可以使用dp[n]获取,也可以使用dp[-1]获取。

3. 递推算法

针对上面的动态规划算法,仔细想一想,每一项只和前3项有关,是不是只要保存这3项就可以了呢?

答案是肯定的,只需要4个变量就够了,1个表示当前项,另外3个用来保存前3项,从而节省了一个列表,这就是递推的写法,也叫迭代,代码如下:

图片

代码不难,强调一点,由于每一次都需要保存最后3项,需要不断更新f1,f2,f3的值,这就是f1, f2, f3 = f2, f3, f4的作用。

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

四.总结与思考

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

  • 循环语句;

  • 条件语句;

  • 列表;

  • 递归算法;

  • 动态规划函数;

  • 递推算法;

本题分值为60分,难度中等。关键点有两个,一是找到搬运物品方案的规律,确定好推导公式,二是使用多种算法来实现。

在找规律确定推到公式的问题时,一定要学会运用递归思维,将问题简化为两个步骤。最后一步保留,最后一步之前的所有步骤当作一步,然后看最后一步是如何计算出来的。切不可小瞧了这一点,在编程中,有很多问题都可以使用这一思维来解决。

本教程讲解了3种解决方案,这3种方案绝不是孤立的,它们之间都有一个共同的观点,这就是推导公式。

实际上,凡是有推导公式的问题,基本上可以采用这3种算法,尤其是带备忘录的递归和动态规划。如果说递归是自顶向下的推导过程,那么动态规划就是自底向上的推导过程。

和斐波那契数列相关的题目在历届真题中多次出现,如下:

  • 《病毒繁殖-第12届蓝桥杯选拔赛Python真题精选》

  • 《密室逃脱游戏-第12届蓝桥杯省赛Python真题精选》

  • 《跳房子游戏-第13届蓝桥杯选拔赛Python真题精选》

你可以放在一起来分析对比,以加深理解。

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1873194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis 哨兵主备切换的数据丢失问题应该怎么解决?

引言:Redis作为一种高性能的内存数据库,广泛应用于分布式系统中。为了保证服务的高可用性,Redis提供了哨兵(Sentinel)机制,用于监控和管理Redis实例的自动故障恢复。然而,即使在哨兵的保护下&am…

计算机视觉中一些特殊的安装包

opencv-python Could not build wheels for opencv-python which use PEP 517 and cannot be installed 安装pip install opencv-python 输出 Collecting opencv-pythonDownloading https://files.pythonhosted.org/packages/77/f5/49f034f8d109efcf9b7e98fbc051878b83b2f02a1…

Windows宝塔面板部署ThinkPHP8.0创建Vue项目案例

安装ThinkPHP8.0 登录宝塔面板,创建一个站点。 输入composer代码,执行完成后自动创建TP目录 composer create-project topthink/think tp 网站目录设置为tp,运行目录设置为public 设置PHP版本为8.0以上,不然会出现下面的报错代…

【MotionCap】ImportError: cannot import name ‘packaging‘ from ‘pkg_resources‘

ImportError: cannot import name ‘packaging’ from ‘pkg_resources’ 降低setuptools的版本 参考大神:(ai-mocap) zhangbin@ubuntu-server:~/proj/04_mocap/third-party$ pip install -e neural_renderer

VBA 批量变换文件名

1. 页面布局 在“main”Sheet中按照下面的格式编辑。 2. 实现代码 Private wsMain As Worksheet Private intIdx As LongPrivate Sub getExcelBookList(strPath As String)Dim fso As ObjectDim objFile As ObjectDim objFolder As ObjectSet fso = CreateObject("Scrip…

为什么说BIM在机电安装行业是刚需?3D开发工具HOOPS如何促进BIM发展?

在建筑行业中,机电安装是一个复杂且精细的工程领域,它涉及到电气、管道、通风和控制系统等多个方面。随着建筑项目规模的不断扩大和复杂性的增加,传统的二维设计方法已经难以满足现代建筑的需求。正是在这种背景下,BIM技术应运而生…

第7章 Redis的噩梦:阻塞

文章目录 前言1 发现阻塞2.内在原因2.1API或数据结构使用不合理2.1.1如何发现慢查询2.1.2.如何发现大对象 2.2 CPU饱和2.3 持久化阻塞2.3.1fork阻塞2.3.2.AOF刷盘阻塞2.3.3.HugePage写操作阻塞 3 外在原因3.1CPU竞争3.2 内存交换 前言 Redis是典型的单线程架构,所有…

基于横纵向的混合联邦学习原理分析

近期陆续接触到关于混合联邦学习的概念,但基于横纵向的混合联邦实际的应用案例却几乎没有看到,普遍是一些实验性的课题,因此这一领域知识没有被很好普及。本篇文章的目的,主要是分析讨论关于横纵向混合联邦学习的业务场景、应用架…

【MySQL】InnoDB的存储结构

InnoDB的存储结构:每个表都会生成一个表空间文件,这个文件里面最小结构就是行,存储的真正的数据,一个页来管理若干行,一个区来管理若干页,一个区组来管理若干区。段并不是真正的物理存储结构,它…

Unity | Shader基础知识(番外:模型的制作流程)

目录 一、前言 二、模型的诞生 三、模型的表面 四、模型的贴图 五、上完材质的模型 六、材质的来源 七、作者的碎碎念 一、前言 up发现,初学程序,除非你是美术,模型出生,要不然对这些都是萌萌哒(蒙蒙哒&#x…

基于51单片机心形LED流水灯电路原理图、PCB和源程序(SCH、PCB源文件)

资料下载地址:基于51单片机心形LED流水灯电路原理图、PCB和源程序(SCH、PCB源文件) 1、单片机心形LED流水灯功能说明: 单片机:无论是散件还是成品,单片机里面都烧录有LED 流水灯的程序,装上单片…

一文汇总VSCode多光标用法

光标的创建 按住alt,鼠标左键单击,在单击位置生成光标/删除光标 按住ctrlalt,单击↑/↓,在每行同一个位置(若某一行较短,则在行尾)生成光标,这个不会删除光标,只会在光标…

【语言模型】深入探索语言模型中的神经网络算法:原理、特点与应用

随着人工智能技术的飞速发展,神经网络算法在语言模型中的应用日益广泛,为自然语言处理领域带来了革命性的变革。本文将深入探讨当前语言模型中常用的几种神经网络算法,包括全连接神经网络、卷积神经网络、循环神经网络、长短期记忆网络、门控…

RabbitMQ(七)Shovel插件对比Federation插件

文章目录 Shovel和Federation的主要区别(重点)一、启用Shovel插件二、配置Shovel三、测试1、测试计划2、测试效果发布消息源节点目标节点 Shovel和Federation的主要区别(重点) • Shovel更简洁一些 • Federation更倾向于跨集群使…

Oracle中常用内置函数

一、字符串函数 CONCAT(s1, s2):连接两个字符串s1和s2。 SELECT CONCAT(Hello, World) FROM DUAL-- 结果:Hello World --或者使用 || 操作符 SELECT Hello || World FROM DUAL -- 结果:Hello World INITCAP(s):将字符串s…

深入理解计算机系统 CSAPP 8.4.2 fork函数

//fork.c #include <sys/types.h> #include <unistd.h> #include <stdio.h>int main() {pid_t fpid; //fpid表示fork函数返回的值int count 0;fpid fork();if (fpid < 0)printf("error in fork!");else if (fpid 0) {printf("\ni am th…

sql sever 存储过程不能请求https的解决方案

此错误的原因&#xff0c;通常是因为SQL Server默认不允许非加密的HTTP请求。为了解决这个问题&#xff0c;需要配置SQL Server允许非密码的https请求&#xff0c;或者使用密码的http请求。 下面是配置SQL Server允许非加密http请求 UsE [master] ;Go EXEC sp_configure Sh…

Kotlin/Android中执行HTTP请求

如何在Kotlin/Android中执行简单的HTTP请求 okhttp官网 okhttp3 github地址 打开build.gradle.kts文件加入依赖 dependencies {implementation("com.squareup.okhttp3:okhttp:4.9.0") }在IDEA的Gradle面板点击reload按钮便会自动下载jar

算法设计与分析--考试真题

分布式算法试题汇总选择题简答题算法题 2013级试题2019级试题2021年秋考卷 根据考试范围找相应题目做。 分布式算法试题汇总 选择题 下述说法错误的是___ A 异步系统中的消息延迟是不确定的 B 分布式算法的消息复杂性是指在所有合法的执行上发送消息总数的最大值 C 在一个异步…

【实用指南】铝聚合物电容器的焊接技巧与故障排除,工程师必备知识

铝聚合物电容器是一种电解电容器&#xff0c;在电子元器件领域&#xff0c;以其卓越的性能表现逐渐成为工程师们青睐的选择&#xff0c;尤其在对电容特性有严格要求的应用场合。其特点是使用铝箔作为阳极&#xff0c;并在阳极表面形成一层氧化铝&#xff08;Al2O3&#xff09;作…