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

news2024/12/23 4:11:54

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

病毒繁殖,本题是2021年3月27日举办的第12届蓝桥杯青少组Python编程选拔赛真题,题目要求编程求解在第N分钟时,病毒粒子的总数量。

先来看看题目的要求吧。

一.题目说明

提示信息:

某种病毒具有很强的繁殖能力,从病毒粒子出生后的第5分钟开始,每分钟可以复制出一个新的病毒粒子。新出生的病毒粒子从第5分钟开始,也可以每分钟复制一个新的病毒粒子。

举例来说,第1分钟时有一个病毒粒子,此病毒粒子从第5分钟开始复制新的病毒粒子,因此第5分钟时的病毒数量为2个;第6分钟时又复制出新的病毒粒子,因此第6分钟的病毒数量为3个;以此类推,第7分钟时病毒粒子数为4;第8分钟时病毒粒子数为5;第9分钟时,第5分钟复制出的病毒粒子开始复制新的病毒粒子,因此第9分钟时的病毒总数为7;第10分钟时,第6分钟复制出的病毒粒子开始复制新的病毒粒子,因此第10分钟时的病毒粒子总数为10。

编程实现:

计算病毒粒子总数,已知第一分钟时出生了一个病毒粒子,假设所有病毒粒子不会自动死亡,请计算第N分钟时的病毒粒子总数。

例如:前10分钟病毒粒子的总数分别为1,1,1,1,2,3,4,5,7,10。

输入描述:

输入正整数 N(0 < N ≤ 60),表示时间

输出描述:

输出第N分钟时,病毒粒子的总数

样例输入:

6

样例输出:

3

二.思路分析

这是一道算法题,考查的算法有递归和递推,涉及的知识点包括循环、条件、列表和函数等。

看到这个题目所描述的场景,你会想到什么呢?

对了,就是斐波那契数列,也叫兔子数列。13世纪意大利数学家斐波那契的《算盘书》中记载了典型的兔子产仔问题。

图片

其大意如下:

如果一对两个月大的兔子以后每一个月都可以生一对小兔子,而一对新生的兔子出生两个月后才可以生小兔子。也就是说,1月份出生,3月份才可产仔。那么假定一年内没有产生兔子死亡事件,那么1年后共有多少对兔子呢?

斐波那契数列是一个非常经典的算法编程题目,有多种实现方法,比如递归和递推等。

不管是使用哪种算法,其关键在于要确定递推公式,比如斐波那契数列的递推公式是这样的:

图片

那本题描述的病毒繁殖,递推公式又是怎样呢?

对于这类问题,我们用f(n)来表示问题的解,通常有如下两种推导方式:

1). 正向推导,利用已知数列找规律;

2). 逆向推导,分析f(n)和f(n-1)之间的关系;

我们先用正向推导方法,题目给出了一个例子,前10分钟病毒粒子的总数分别为:

1,1,1,1,2,3,4,5,7,10

由于新出生的病毒粒子从第5分钟开始复制,说明前面4分钟的病毒例子都只有1个,即:

f(1) = f(2) = f(3) = f(4) = 1

第5分钟,开始复制一个例子,于是就得到了两个病毒粒子:

f(5) = f(4) + f(1) = 1 + 1 = 2

第6分钟呢,它是在第5分钟的基础上,又增加了一个,增加的一个是第1个病毒粒子复制出来的:

f(6) = f(5) + f(2) = 2 + 1 = 3

以此类推,可以分别计算出第7、8、9分钟的病毒数量:

f(7) = f(6) + f(3) = 3 + 1 = 4f(8) = f(7) + f(4) = 4 + 1 = 5

到第9分钟时,第5分钟复制出来的第2个病毒粒子也开始复制了,也就是说有两个病毒粒子在复制,要增加2个,其病毒数量计算如下:

f(9) = f(8) + f(5) = 5 + 2 = 7

第10分钟时,病毒数量计算如下:

f(10) = f(9) + f(6) = 7 + 3 = 10

因此,我们可以得到如下递推公式:

图片

接下来,我们使用逆序推导的方式,此时我们只需要考虑f(n)和f(n-1)之间的关系。

为了方便描述,我们引入两个概念,存量和增量。

图片

所谓存量,是指原来就有的,比如要计算第n分钟的病毒数量f(n),存量就是第n-1分钟的病毒数量f(n - 1)。

所谓增量,是指新增的部分,对于本题而言,就是新复制出来的病毒,那么新复制出来多少呢?

此时,我们只需要明白一点,新出生的病毒粒子从第5分钟才开始复制,可以理解为病毒有4分钟的生长期。

也就是说,在第n分钟时,只有第n - 4分钟的那些病毒粒子才可以复制病毒粒子,所以增量就是f(n - 4)。

两者相加,就是第n分钟的病毒粒子数,如下:

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

同时,我们还要考虑边界情况,要确保n - 1和 n - 4都大于0,所以n < 5时,需要单独处理。可以理解为前4分钟,病毒粒子还不具备繁殖能力,不能使用这个推导公式来推导。

有了推导公式,问题就变简单了,接下来,我们就进入具体的编程实现环节。

三.编程实现

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

  • 递归算法

  • 递推算法

1. 递归算法

根据前面的思路分析,先定义递归函数,然后调用即可,代码如下:

图片

代码比较简单,说明两点:

1). 为了完整性,这里增加了 <= 0的判断,实际上本题中的N是大于0的,所以不写也是可以的;

2). return不仅可以返回结果,还可以直接结束程序,所以只需要使用if语句就行,代码更简洁。

但是,考虑到N的范围是0~60,随着N的增加,时间复杂度急剧增加,所以会存在超时情况。

可以考虑使用带备忘录的递归算法,代码改进如下:

图片

说明如下:

1). 需要借助一个列表,用来保存f(n)的值,其长度为n+1,默认值都是0;

2). 在定义函数的时候,尽量不要依赖外部变量,所以这里将memo列表作为参数进行传递。

2. 递推算法

递归问题,通常都可以改用递推算法来实现。为了方便,我们可以定义一个列表来保存每一分钟的病毒数量。

对应的代码如下:

图片

代码不多,强调2点:

1). 为了方便,这里借用了列表arr,下标i对应的就是第i分钟,所以第一项表示第0分钟,设置为0;

2). 需要分情况讨论,当n < 5时,只需将第1~n项都设置为1,当n >= 5时,先将第1~4项设置为1,然后再利用递推公式计算第5~n项。

当输入n = 10的时候,arr数组如下:

图片

因此,我们只需要输出arr[10]即可。

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

四.总结与思考

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

  • 循环语句,主要for...in循环;

  • 条件语句,包括单分支和双分支;

  • 列表的使用;

  • 函数的定义及使用;

  • 递归算法;

  • 递归算法;

本题作为stema测评的最后一题,难度不小。这里的关键点在于如何找到推导公式,并选择相应的算法来实现。

在探寻推导公式的时候,我们使用了两种策略,一是正向推导,二是逆向推导。

实际上,正向推导就是归纳法,其核心思想是从特殊到一般的推理过程,通过对众多的事物特例进行观察和综合,以发现一般规律的推理方法。

而逆序推导就是演绎法,它是一种从普遍性的前提出发,通过逻辑推理得出个别或特殊结论的方法。它基于已知的一般原则或假设,推导出具体的结论,确保如果前提为真,则结论也必然为真。

这是两种非常重要的思维方式,也是我们认识、理解和探索这个世界的基本方法。

二者各有其特点和适用范围,归纳法有助于我们发现新知识和规律,而演绎法则确保从已知前提中得出必然结论。在实际应用中,两种方法常常相互补充,共同推动人类知识的积累和发展。

学习编程不仅仅是学习编程知识,更重要的是培养孩子的思维,包括逻辑思维、数学思维和计算思维。

归纳法和演绎法是逻辑思维的两种具体体现,这两种思维的培养和提升,对于提高我们的逻辑思考能力和问题解决能力至关重要。在平时的学习过程中,要有意识地加强这些思维的训练和提升。

超平老师给你留一道思考题,在上面的递推算法中,我们借助了一个列表用于保存第n分钟的病毒数量,如果不使用数组,是否可以,又该如何实现呢?

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

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

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

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

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

相关文章

气象观测站点数据下载与处理

一、下载途径 全国400多个气象站气候数据&#xff08;1942-2022&#xff09; 王晓磊&#xff1a;中国空气质量/气象历史数据 | 北京市空气质量历史数据 气象数据免费下载网站整理 中国气象站观测的气象数据怎么下载 二、R语言处理 2.1 提取站点文件 library(dplyr) library(…

4、XTuner 微调个人小助手(笔记)

视频地址&#xff1a; https://b23.tv/QUhT6ni 课程文档&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/xtuner/readme.md 作业文档&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/xtuner/homework.md 1、Finetune 简介 两种Finetune范式 …

LeetCode_丑数

题目&#xff1a; 题解&#xff1a; 由题&#xff0c;我们知道丑数大于0&#xff0c;丑数都可以写成2*2*...*2*3*3...*3*5*5...*5&#xff0c;有了这个基础就很好写代码了。 用三个while循环将前面的2 3 5全部除掉如果这个数是丑数&#xff0c;最后n是等于1的&#xff0c;反之…

Leetcode-48-旋转图像

题目说明 给定一个 n n 的二维矩阵表示一个图像。 将图像顺时针旋转 90 度。 说明&#xff1a;你必须在原地旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 示例 1: 给定 matrix [ [1,2,3], [4,5,6], [7,8,9] ], 原地旋转输入…

代码随想录阅读笔记-回溯【全排列】

题目 给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。 示例 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 思路 以[1,2,3]为例&#xff0c;抽象成树形结构如下&#xff1a; 回溯三部曲 1、递归函数参数 首先排列是有…

机器学习和深度学习-- 李宏毅(笔记与个人理解)Day 14

Day 14 Classfication (short version) 二分类的时候 用sigmoid 那不就是 logistic 回归嘛&#xff08;softmax 的二分类等价&#xff09; Loss 哦 今天刚学的 &#xff0c;KL散度 &#xff0c;看来cross-entropy 和KL散度是等价的咯~ 我感觉我的直觉没错 这里MSE离得很远的时候…

五、书架开发--5.书架分组功能开发

Dialog和ShelfGroupDialog的基本实现思路&#xff1a; 加入两个组件&#xff0c;一个是Dialog移出分组的弹窗&#xff0c;一个是ShelfGroupDialog&#xff0c;一个是create-api中加入这个ShelfGroupDialog 接下来我们看看这个移动书籍这个对话框的实现原理 如下&#xff0c;用…

Python 标准库functools高阶函数用法

目录 1. partial 用法示例 2. reduce 用法示例 3. total_ordering 用法示例 4. cmp_to_key 用法示例 5. lru_cache 用法示例 6. singledispatch 用法示例 7. update_wrapper 用法示例 8. partialmethod 用法示例 9. singledispatchmethod 用法示例 10. cache 用法示例…

HoloLens2开发时,VS2022的组件和模块配置

HoloLens2开发的时候&#xff0c;VS2022的安装和配置清单&#xff08;有的模块可能不是必须的模块&#xff09; 一、大的模块配置 二、各模块组件的配置

详解运算符重载——探索运算符重载的应用

前言:运算符重载是面向对象的一个重要的知识点。我们都知道内置类型可以进行一般的运算符的运算。但是如果是一个自定义类型&#xff0c; 这些运算符就无法使用了。那么为了解决这个问题&#xff0c; 我们的祖师爷就在c中添加了运算符重载的概念。 本篇主要通过实例——日期类的…

Emacs之增加/取消输入括号自动匹配(一百三十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

安卓apk文件签名

一、环境准备 链接: https://pan.baidu.com/s/1D3WxIL5M5ewyFNTqJzARPw 提取码: pd6w 上篇博文编译的apk文件 1、docker build -t android-build:v1.0.1 . 直接制作镜像 2、docker run -it android-build:v1.0.1 /bin/bash 运行进入容器 指定sdk的路径&#xff0c;然后直接…

AI - 提示词意外收获 (5)

提示词&#xff1a; A soft pink rose with opalescent leaves, located in a surreal desert under the light of a binary star system, The dual shadows and contrasting lights create a dreamlike quality, emphasizing the roses unique beauty,翻译: 一种柔软的粉红…

RESA 车道线检测模型-debug分析

车道线检测模型 RESA 该模型只有一个关键点就是resa模块&#xff0c;把这个想清楚就没什么了&#xff0c;下面看代码 class RESA(nn.Module):def __init__(self, cfg):super(RESA, self).__init__()# self.iter cfg.resa.iter# chan cfg.resa.input_channel# fea_stride c…

绝地求生:PUBG七周年:杜卡迪联动即将到来!

4.13号PUBG官博放出来一个图片让大家猜测是什么东西。 结合之前绝地求生的官方的公告&#xff0c;该载具皮肤毫无疑问就是著名摩托车品牌&#xff1a;杜卡迪。 这篇文章就来简单分析一下本次即将到来的摩托车联动的具体细节。 品牌介绍 杜卡迪&#xff08;Ducati Motor &…

【测试开发学习历程】python常用的模块(中)

目录 5 time模块 5.1、Python中的四种格式的时间&#xff1a; 5.2、time模块中的常用函数 6 I/O流操作 6.1 创建文件 6.2 读取一个文件存入到另外一个文件 6.3 with open as 结构 6.4 open和with open as的区别 7 Excel的操作模块-openpyxl 7.1、新建Excel文件进行读…

PTA 编程题(C语言)-- 判断素数

题目标题&#xff1a; 判断素数 题目作者 陈越 浙江大学 本题的目标很简单&#xff0c;就是判断一个给定的正整数是否素数。 输入格式&#xff1a; 输入在第一行给出一个正整数N&#xff08;≤ 10&#xff09;&#xff0c;随后N行&#xff0c;每行给出一个小于…

渗透测试实战——第一站

仅供交流学习使用&#xff0c;请勿用于非法用途 前言&#xff1a;刚学了sql注入&#xff0c;只听理论总感觉没啥用&#xff0c;今天花了一半个多小时&#xff0c;去尝试寻找有漏洞的网站&#xff0c;最终找到了一个&#xff1b;实践是检验真理的唯一标准。 我是通过黑客常用语法…

网络基础先导

前言&#xff1a;最好在牢固前面几大件&#xff08;编程语言、数据结构、操作系统&#xff09;&#xff0c;并且您有一个服务器的基础上&#xff08;我使用的是腾讯云中配置最低的服务器&#xff09;再来学习本系列的网络知识。 1.网络发展简要 下面就是简单提及一些概念而已&…

Shortened LLaMA:针对大语言模型的简单深度剪枝法

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 论文标题 & 发表会议&#xff1a;Shortened LLaMA: A Simple Depth Pruning for Large Language Models&#xff08;ICLR 2024 Workshop&#xff09; 论文地址&#xff1a;https://arxiv.org/abs/…