百钱百鸡-第11届蓝桥杯选拔赛Python真题精选

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

百钱百鸡,本题是2019年~2020年举办的第11届蓝桥杯青少组Python编程选拔赛真题(具体日期不详),题目要求编程解决经典的百钱百鸡问题,即拿100元钱买100只鸡,可以买到公鸡、母鸡和小鸡各多少只。

先来看看题目的要求吧。

一.题目说明

背景信息:

我国古代数学家张丘建(公元五世纪,南北朝时期)在《算经》一书中最早提出了不定方程组的数学问题,原文为:鸡翁一值钱五,鸡母一值钱三,鸡维三值钱一。

百钱买百鸡,问鸡翁、鸡母、鸡维各几何?

编程实现:

上述问题即:拿100 元钱买 100 只鸡。如果公鸡 5 元一只,母鸡 3 元一只,小鸡仔 1元3只,应该各买多少只?

请编程求解,输出所有可能的答案。

输入描述:

输出描述:

输出所有的答案;要求一行品示一组答案,分行输出所有的答案。输出样例如下:

公鸡XX只,母鸡XX只,小鸡仔XX只

公鸡XX只,母得XX只,小鸡仔XX只

评判标淮:

  • 6 分:至少能输出一组正确的答案,输出格式不需要符合样例;

  • 5分:至少能输出一组正确的答案,且输出格式符合样例;

  • 9分:分行输出所有正确的答案,且输出格式符合样例。

二.思路分析

这是一道经典的计算题,考查的知识点包括枚举算法、循环嵌套和条件语句。

图片

百钱百鸡是一道经典的数学问题,在数学中,一般会使用列方程的方式来求解。

假设公鸡数量为x,母鸡数量为y,小鸡数量为z,如图:

图片

可以得到如下方程式组:

5x + 3y + z/3 = 100x + y + z = 100

其中x、y、z的值范围都是0~100,包括0和100。

很显然,这里有3个未知数,但是只有两个方程式,所以这是一个不定方程,其解有多组。

对于有多组解的不定方程,需要使用猜解的方式,所谓猜解,就是逐个列举,找到满足方程式的解,这其实就是枚举法。

对于计算机来说,枚举是它的强项,所以,我们可以使用枚举算法来解决。

如果只是想得到问题的解,代码是比较简单的。但是,对于算法的具体实现,不同的同学可能会有不同的见解,自然也会有不同的写法。

如何写出算法效率更高的代码,也是我们需要考虑的一个问题。

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

三.编程实现

根据上面的思路分析,我们分两步来编写程序:

  • 简单实现

  • 逐步优化

1. 简单实现

根据前面的思路分析,我们用一个最简单粗暴的方式来编写代码,如下:

图片

代码非常简单,运行程序,效果如下:

图片

从结果上来看,没有任何问题,但是从效率来看,这个代码就有点惨不忍睹啦,所以我们需要进行优化,提升算法的效率。

如何考量算法的效率呢,最常用的就是时间复杂度,也就是所谓的大O表示法。简单来说,就是程序执行的次数。

那你知道上面的程序,重复执行了多少次吗?

一共是101 * 101 * 101 =  1030301次,不经意间就已经百万级别了,是不是感觉怪吓人的。

2.逐步优化

在上面的循环中,我们的变量x、y、z的范围都是0~100,实际上,母鸡的数量最多只有100//5 = 20,公鸡的数量最多只有 100//3 = 33只,而小鸡的数量最多有100 * 3 = 300只。

稍作修改,代码如下:

图片

代码中增加了一个变量cnt,用于统计循环的次数,运行程序,如下:

图片

结果一样,cnt的值为214200,这说明循环次数由原来的100万降低到21万,效率提升了80%。

还可以继续优化,之所以次数较多,主要是因为嵌套了3层循环,能否减少一层呢?

完全可以,既然已经知道公鸡有x只,母鸡有y只,那么小鸡就是(100 - x - y)只了,这样就可以将3层循环简化为两层循环。

相应的代码如下:

图片

运行程序,结果如下:

图片

这一次循环次数只有714,和21万相比,效率提升了300倍,和最初的100万相比,效率提升了1400倍!

优化到这里,就已经非常好了,但是从算法的角度来讲,还是有继续优化的空间。

还记得前面列出的方程式吧:​​​​​​​

5x + 3y + z/3 = 100x + y + z = 100

如果将这里的z消掉,只保留x和y的值,可以得到如下方程式:

y = 25 - 7/4 * x

这里的y表示母鸡的数量,肯定是大于等于0的整数,这就意味着:

25 - 7/4 * x >= 0

稍作简化,可以得到:

x <= 14

因为y是整数,也就意味着7/4 *x 是整数,所以x必须是4的倍数,这样就可以得到x的取值可以是:

0、4、8、12

因此,我们只需要一层循环即可,也不需要条件判断了,对应的代码如下:

图片

运行程序,结果如下:

图片

这一次,只需要执行4次,就可以了和之前的次数相比,几乎可以忽略不计了,厉害吧。

当然了,在实际答题的时候,不需要这里的cnt变量。

至此,整个程序就优化完成了,你也赶紧来试试吧。

四.总结与思考

本题的分数为20分,代码在8行左右,涉及到的知识点包括:

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

  • 循环嵌套的使用;

  • print()函数的格式化输出;

  • 枚举算法的实现及其优化;

题目难度一般,如果不考虑算法的效率,只要学过循环和选择结构,基本上都能快速地写出程序。但是,只写出程序是不够的,我们还得写出高效的程序。

实际上,在所有的编程竞赛中,当然也包括蓝桥杯,对程序的执行时间(时间复杂度)和占用空间(空间复杂度)都有明确的要求。

这就要求我们编写的程序必须满足“双低”,即低时间复杂度和低空间复杂度。

对于编程而言,所有的算法都离不开枚举,但是不能仅仅停留在暴力枚举层面,而是要思考如何聪明的枚举,如何高效的枚举,于是针对不同的问题采取了使用了不同的策略,这才产生了众多的算法。

这也要求我们在平时学习编程的时候,也要多思考一下,有没有更简单更高效的算法,这样才能快速提升自己的编程水平和算法能力。

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 7 离线安装达梦数据库8.0

前期准备工作 确认操作系统的版本和数据库的版本是否一致 ## 查看系统版本&#xff1a;cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)关闭防火墙和Selinux # 查看selinux是不是disabled / enforce cat /etc/selinux/config## 查看防火墙状态 firewall-cmd …

【EI会议征稿】2024年人工智能与大模型国际学术会议(AIFM 2024)

2024年人工智能与大模型国际学术会议(AIFM 2024) 2024 International Conference on Artificial Intelligence and Foundation Model 2024年人工智能与大模型国际学术会议(AIFM 2024)将于2024年1月19-21日在南昌召开。本次会议围绕人工智能与大模型的发展应用&#xff0c;聚集…

Edge浏览器版本更新后Copilot按钮消失的解决应对方式

需求背景 今天突然发现Edge浏览器右上角的Copilot按钮不见了&#xff0c;排查了一下&#xff0c;发现可能是浏览器自动升级到120版本后&#xff0c;关闭了右上角的Copilot按钮。案发现场如下&#xff1a; 原因如下&#xff1a; 说实话&#xff0c;人家这个插件还是很好用的&…

JMeter直连数据库

JMeter直连数据库 使用场景操作步骤 使用场景 用作请求的参数化 登录时需要的用户名&#xff0c;密码可以从数据库中查询获取 用作结果的断言 添加购物车下订单&#xff0c;检查接口返回的订单号&#xff0c;是否与数据库中生成的订单号一致 清理垃圾数据 添加商品后&#xff…

HarmonyOS 的应用开发语言:ArkTS

本心、输入输出、结果 文章目录 HarmonyOS 的应用开发语言&#xff1a;ArkTS前言ArkTS 产生背景ArkTS 语言特点ArkTS 基本语法ArkTS 声明式 UIArkTS 状态管理ArkTS 渲染控制 ArkTS 轻量化并发机制ArkTS 相关文档花有重开日&#xff0c;人无再少年实践是检验真理的唯一标准 Harm…

高通平台开发系列讲解(USB篇)MBIM协议详解

文章目录 一、MBIM协议二、MBIM 消息类型三、基本控制消息构成3.1、MBIM OPEN MSG FORMAT3.2、MBIM CLOSE MSG FORMAT3.3、MBIM_COMMAND_MSG3.4、MBIM_COMMAND_DONE3.5、MBIM_INDICATE_STATUS_MSG四、MBIM Message(UUID+CID)4.1、UUID_BASIC_CONNECT

网络服务IP属地发生变化的原因有哪些?

近期&#xff0c;许多用户发现自己的网络服务IP属地发生了变化。原本固定的IP地址不再是静态的&#xff0c;而是发生了变动。这一现象引起了广大用户的关注和疑惑&#xff0c;对网络服务的使用和信息安全产生了影响。为了解决用户的疑虑&#xff0c;我们对此现象进行了深入探究…

循环神经网络-1

目录 1 数据集构建 1.1 数据集的构建函数 1.2 加载数据并进行数据划分 1.3 构造Dataset类 2 模型构建 2.1 嵌入层 2.2 SRN层 2.3 线性层 2.4 模型汇总 3 模型训练 3.1 训练指定长度的数字预测模型 3.2 多组训练 3.3 损失曲线展示 4 模型评价 总结 参考文献 循环神经网络&…

【FPGA/verilog -入门学习11】verilogTestbench中的文本文件写入,读出,打印等操作

本文参考&#xff1a;Verilog中的系统任务&#xff08;显示/打印类&#xff09;--$display&#xff0c; $write&#xff0c;$strobe&#xff0c;$monitor-CSDN博客 Verilog&#xff1a;parameter、localparam的区别和用法-CSDN博客 Verilog的系统任务----$fopen、$fclose和$fd…

IDEA 出现问题:git提交commit时Perform code analysis卡住解决方案

问题 git提交commit时Perform code analysis卡住很久 解决方案一 1、打开 IntelliJ IDEA&#xff0c;进入 File -> Settings&#xff08;或者使用快捷键 CtrlAltS&#xff09;。 2、在弹出的 Settings 窗口中&#xff0c;找到 Version Control -> Commit Dialog 选项…

Chrome谷歌浏览器安装VUE调试插件

访问gitee的vue-devtools 并下载 gitee地址&#xff1a;https://gitee.com/zhang_banglong/vue-devtools 也可以访问git的地址&#xff1a;https://github.com/vuejs/devtools 解压&#xff0c;放到自己的目录下 打开控制面板&#xff08;管理员&#xff09;&#xff0c;进入…

C语言之函数

目录 main函数和库函数 什么是函数 函数定义 函数头&#xff08;function header&#xff09; 1.返回类型&#xff08;return type&#xff09; 2.函数名&#xff08;function name&#xff09; 3.形参声明&#xff08;parameter type list&#xff09; 函数体&#xff…