最大乘积和-第13届蓝桥杯省赛Python真题精选
[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第85讲。
最大乘积和,本题是2022年4月17日举办的第13届蓝桥杯青少组Python编程省赛真题编程部分第5题,13届一共举办了两次省赛,这是第一次省赛。题目要求对于N个正整数,编程计算出所有乘积相加的数值最大的排列方式,并输出数值。
先来看看题目的要求吧。
一.题目说明
编程实现:
有N个正整数,现对N个正整数进行不同方式的排列,每次排列后都会按照以下规则进行一次计算,聪明的小蓝发现,排列方式不同,最后计算出的结果也不相同。
计算规则:
第一次:第一个数乘以第二个数乘以第三个数,结果记录为M(1) ;
第二次:第二个数乘以第三个数乘以第四个数,结果记录为M(2) ;
第三次:第三个数乘以第四个数乘以第五个数,结果记录为M(3) ;
…
第N − 2次:第N − 2个数乘以第N − 1个数乘以第N个数,结果记录为M ( N − 2 ) 。
最后计算M(1) + M(2) + M(3) . . … . M(N − 2)的数值。找出一种排列方式使这个数值最大。
例如:N = 4,4个正整数分别为1,2,3,4,那么排列方式就会有24种,其中排列方式为1,3,4,2时,按照规则计算2次:1 × 3 × 4 = 12,3 × 4 x 2 = 24,乘积相加:12 + 24 = 36 这种排序方式是所有乘积相加的数值最大,为36。
输入描述:
输入N个正整数,正整教之间一个英文逗号隔开。
输出描述:
找出所有乘积相加的数值最大的排列方式,并输出数值。
输入样例:
1,2,3,4
输出样例:
36
二.思路分析
这是一道和排列组合相关的算法题,涉及的知识点包括循环、列表、排列函数、枚举算法和贪心算法等。
乍一看,这不就是典型的组合排列问题嘛。
将N个正整数的全排列都列举出来,逐个计算M(1) + M(2) + … . M(N − 2)的值,就可以得到最大值。
针对本题,我给出两种解决方案:
-
枚举算法 + 排列函数
-
贪心算法
1. 枚举算法 + 排列函数
这个比较好理解,就是先使用permutations()函数获取所有的排列,然后使用循环分别计算每一种排列的乘积和,通过比较找到最大值。
计算排列比较简单,关键是针对每一种排列都要计算乘积和。为了方便,可以使用自定义函数来处理,从而简化代码结构。
2.贪心算法
从理解的角度来看,使用排列函数是最佳方案,但是随着数字规模的增加,其缺点也越来越明显,那就是算法的时间复杂度越来越高,算法效率将大打折扣。
实际上,还有一种更高效的方法,这就是贪心算法。
假定有5个数字,自左至右分别是abcde,如图所示:
它一共有3个乘法算式,如下:
M(1) = a * b * c
M(2) = b * c * d
M(3) = c * d * e
很容易,发现如下3条规律:
-
两端的a和e,都只参与了一次运算;
-
左2的b和右2的d,参与了两次运算;
-
中间位置的c,参与了3次运算;
随着数字个数的增加,中间位置的数字可以有多个,它们都需要参与3次运算。
很显然,将最大的数字放在中间,接下来每一次都找到当前最大的数字,并和之前已经存放的最大数字紧挨着,最小的数字放在两端,这样就可以得到更大的乘积,这不就是贪心算法的思想嘛。
接下来我们举例说明,如果有4个数字,分别是1、2、3、4,那么肯定要将3和4放在中间,1和2放在两端。
不过,放在两端时,需要考虑2的位置,它既可以放在4的旁边,也可以放在3的旁边,肯定找最大的呀,也就是2和4挨在一起,可以得到更大的乘积,即1、3、4、2,如图:
此时,对于原列表[1, 2, 3, 4]来说,处在奇数位的[1, 3]正序排列,处在偶数位的[2, 4]逆序排列。
当然,也可以排列成2、4、3、1,效果一样,如图:
如果有5个数字,分别是1、3、5、7、9,其中9最大,肯定放在正中间,9旁边依次是7和5,两端则分别是3和1,如图所示:
此时,对于原列表[1, 3, 5, 7, 9]来说,处在奇数位的[1, 5, 9]正序排列,处在偶数位的[3, 7]逆序排列。
如果有6个数字,分别是2、3、5、7、8、10,最大的两个数8和10要放在中间,紧接着7和10挨着,5则和8挨着,3和2分列两端,如图:
此时,对于原列表[2, 3, 5, 7, 8, 10]来说,处在奇数位的[2, 5, 8]正序排列,处在偶数位的[3, 7, 10]逆序排列。
如果有7个数字,分别是3、5、5、6、7、9、12,则其排列如图所示:
此时,对于原列表[3, 5, 5, 6, 7, 9, 12]来说,处在奇数位的[3, 5, 7, 12]正序排列,处在偶数位的[5, 6, 9]逆序排列。
讲到这里,相信聪明的你,已经发现这其中的规律和奥妙了。
对于一个有序的序列,先将处在奇数位的数字找出来顺序排列,然后再将处在偶数位的数字找出来逆序排列,构成一个新的列表,就可以得到最大乘积和了。
所以,对于输入的N个正整数,我们可以通过如下4步进行处理:
-
将列表进行排序
-
分别获取奇数位的数字和获取偶数位的数字
-
奇数位数字正序,偶数位数字逆序,构成一个新列表
-
分别计算M(1)、M(2)、...、M(n- 2),并求和
思路有了,接下来,我们就进入具体的编程实现环节。
三.编程实现
根据上面的思路分析,我们分别使用两种方法来实现:
-
枚举算法 + 排列函数
-
贪心算法
1. 枚举算法 + 排列函数
根据前面的思路分析,编写代码如下:
代码不多,说明3点:
1). 对n个数字获取全排列,第一个参数为列表,第二个参数是n;
2). permutations()函数得到的是可迭代对象,使用for循环来获取每一个对象,该对象是元组;
3). 在获取最大值的时候,直接使用了max()函数。
2. 贪心算法
根据前面的思路分析,编写代码如下:
代码不多,强调3点:
1). 在获取奇数和偶数列表的时候,使用了带条件的列表推导式,非常方便;
2). 列表逆序,直接使用切片运算[::-1],方便快捷;
3). 在Python编程中,可以直接将两个列表相加,得到新的列表。
至此,整个程序就全部完成了,你可以输入不同的数据来测试效果啦。
四.总结与思考
本题代码在12行左右,涉及到的知识点包括:
-
循环语句;
-
列表推导式;
-
排列函数;
-
枚举算法;
-
贪心算法;
本题代码不算多,但是难度不小,关键点有两个,一是灵活运用Python自带的排列函数快速解决问题,二是分析乘法算式的特点,找到数字排列的规律,从而找到更高效的算法。
本题给出了两个解决方案,方案一相对比较简单,但并不是最优的方案,大概率会出现超时情况,因为它的时间复杂度太高了。
permutations()函数的时间复杂度取决于输入的数据大小,对于包含n个元素的列表,它会生成n的阶乘个排列,因此,其时间复杂度可以表示为O(n!)。
当n值很大时,阶乘的增长非常快,导致permutations()函数的性能会随着输入大小的增加而急剧下降。
你可以输入1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,来测试一下方法一的效果。
因此,在数据较多的时候,必须要考虑使用其他更高效的方法来避免计算所有排列。
而方案二则使用了贪心算法的思想,找出数字排列的规律,最后通过一次循环就可以计算出最大乘积和。
由于使用了排序函数,因此其时间复杂度主要取决于sort()函数。在Python编程中,sort()方法使用的是Timsort算法,其时间复杂度为O(n log n),其中n是列表的长度。
Timsort算法由Tim Peters在2002年为Python编程语言提出的,并已成为Python sort()方法和sorted()函数的默认排序算法。
Timsort算法是一种混合了归并排序和插入排序思想的排序算法,针对不同情况下的数据集均具有较好的性能表现。
你还有什么好的想法和创意吗,也非常欢迎和超平老师分享探讨。
如果你觉得文章对你有帮助,别忘了点赞和转发,予人玫瑰,手有余香😄
需要源码的,可以移步至“超平的编程课”gzh。
相关文章:

最大乘积和-第13届蓝桥杯省赛Python真题精选
[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第85讲。 最大乘积和&#…...

探索C嘎嘎的奇妙世界:第四关---引用与内联函数
1 引用: 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。 #include<iostream> using namespace std;int main() {int a 0;// 引用:…...

DLS平台:惠誉全球经济展望——今年调增至2.6%,明年调减!
摘要 尽管全球货币政策逐渐转向宽松,惠誉国际评级(Fitch Ratings)在最新的《全球经济展望》中对2024年全球经济增长进行了上调。然而,由于美国经济增速放缓和其他因素的影响,2025年的全球经济增长预期则被下调。这篇文…...

数据结构习题
第一章 绪论 与数据元素本身的形式、内容、相对位置、个数无关的是数据的 逻辑结构。 第二章 线性表 在一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动的元素个数为 63.5。 n/2 单链表的存储密度 小于1。 创建一个包括n个结点的有序单链…...
交通银行软件开发工程师校招面试经历
本文介绍2024届春招中,交通银行总行的软件开发工程师岗位1场面试的基本情况、提问问题等。 2024年04月投递了交通银行总行的软件开发工程师岗位,暂时不清楚所在部门。目前完成了一面,并进入体检阶段;在这里记录一下面试的相关经历…...
bashrc和profile区别
作用与目的: .bashrc:这个文件主要用于配置和自定义用户的终端环境和行为。每次启动新的终端时,.bashrc文件都会被执行,加载用户设置的环境变量、别名、函数等。这使得用户能够根据自己的喜好和需求来定制终端的行为和外观。profi…...

BC153 [NOIP2010]数字统计
数字统计 一.题目描述二.输入描述:三.输出描述:四.数字范围五.题目思路六.代码实现 一.题目描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。 比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次…...
浅谈LavelDB
简介 LevelDB 是一个开源的轻量级键值存储库,由 Google 开发,用于提供快速的键值存储和支持读写大量数据。LevelDB 具有高性能、快速的读取和写入速度以及支持原子操作的特点,适合用于需要高效存储和检索键值数据的场景。 LevelDB 主要特点…...

Google Earth Engine(GEE)——NDVI的时间序列分析和在线出图
函数: ui.Chart.array.values(array, axis, xLabels) Generates a Chart from an array. Plots separate series for each 1-D vector along the given axis. - X-axis = Array index along axis, optionally labeled by xLabels. - Y-axis = Value. - Series = Vector, d…...
谈吐的艺术(三)
不是要逼人屈服,而只是想请人遵守规定。 0可能遇到的问题 在快餐店买到的汉堡和薯条都是凉的,跟店员理论的时候对方却说味道没有不对。怎么说才能维护自己的权利呢? 更好的说法:“我想问一下,按照你们的规定,食品退换…...

pop链详细分析、构造(以[NISACTF 2022]babyserialize为例)
目录 [NISACTF 2022]babyserialize (一)理清pop链(链尾 链头),标注步骤 1. 先找eval、flag这些危险函数和关键字样(这是链尾) 2.往eval()上面看 3.往$bb()上面看 4.往strtolower()上面看 …...

使用超声波麦克风阵列预测数控机床刀具磨损
预测性维护是使用传感器数据来推断机器状态,并从这些传感器数据中检测出在故障发生之前存在的缺陷或故障的过程。预测性维护在所有工业领域都是一种日益增长的趋势,包括轴承故障检测、齿轮磨损检测或往复式机器中的活塞磨损等许多其他例子。在预测性维护…...

怎么控制多个存储设备的访问权限?数据安全存储方案来了
数据安全存储是指将数据以安全的方式存储在存储系统中,以确保数据的机密性、完整性和可用性。要控制数据安全存储的权限以保障安全,可以采取以下措施: 访问控制列表(ACLs):使用ACLs来定义对存储数据的访问权…...

麒麟系统mate_indicators进程占用内存资源高
一、问题现象 故障现象:环境出现内存溢出 操作系统:KYlin10-SP2 二、问题定位 发现mate-indicators进程占用内存资源达到节点总内存40%,导致服务出现内存熔断 临时解决 systemctl restart lightdm.service systemctl set-default multi-u…...

Docker高级篇之轻量化可视化工具Portainer
文章目录 1. 简介2. Portainer安装 1. 简介 Portianer是一款轻量级的应用,它提供了图形化界面,用于方便管理Docker环境,包括单机环境和集成环境。 2. Portainer安装 官网:https://www.portainer.io 这里我们使用docker命令安装&…...

Vue32-挂载流程
一、init阶段 生命周期本质是函数。 1-1、beforeCreate函数 注意: 此时vue没有_data,即:data中的数据没有收到。 1-2、create函数 二、生成虚拟DOM阶段 注意: 因为没有template选项,所以,整个div root都…...

算法金 | 一个强大的算法模型:t-SNE !!
大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 t-SNE(t-Distributed Stochastic Neighbor Embedding)是一种用于降维和数据可视化的非线性算法。它被广泛应用于…...

用IAST工具强化“越权检测”能力,提升系统安全性
什么是越权漏洞 越权漏洞是一种常见的逻辑安全漏洞。越权漏洞指的是攻击者利用系统中的漏洞,获得超过其正常权限的访问权限,执行未授权操作。 越权漏洞主要分为两种类型:水平越权(横向越权)和垂直越权(纵…...

VirtualStudio配置QT开发环境
环境 VirtualStudio2022Qt5.12.10 安装msvc工具链(这一步不是必须的) 打开virtual studio,打开Virtual Studio Installer界面选择要安装的msvc版本,点击安装 安装VirtualStudio扩展 在线安装 打开virtual Studio,…...

Nature发文介绍使用ChatGPT帮助学术写作的三种方式
文章链接:https://www.nature.com/articles/d41586-024-01042-3 一、介绍 这篇文章是由Dritjon Gruda撰写的,讨论了生成性人工智能(AI)在学术写作、编辑和同行评审中的三种应用方式。Gruda认为,尽管学术界对聊天机器…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...