运用贪心算法实现卡牌游戏-2023年全国青少年信息素养大赛Python复赛真题精选

news2025/7/14 0:16:16

[导读]:超平老师计划推出《全国青少年信息素养大赛Python编程真题解析》50讲,这是超平老师解读Python编程挑战赛真题系列的第18讲。

全国青少年信息素养大赛(原全国青少年电子信息智能创新大赛)是“世界机器人大会青少年机器人设计与信息素养大赛”赛事之一,由中国电子学会主办,包含很多赛项,大赛自2013年举办,已连续成功举办八届,已正式入围“2022-2025学年面向中小学生的全国性竞赛活动名单”。 

大赛旨在激发广大青少年的科学兴趣和想象力,培养钻研探究、创新创造的科学精神和实践能力,促进青少年科技创新活动的广泛开展,发现和培养一批具有科研潜质和创新精神的青少年科技创新后备人才。

大赛主要竞赛类别包括电子科技、智能机器人、软件编程三类,全国青少年Python编程挑战赛就属于其中的软件编程类。

一.赛事说明

2023年(第9届)Python挑战赛赛程分为初赛、复赛和总决赛三个阶段。初赛是资格赛,复赛是地方选拔赛,总决赛是全国各地选拔的精英汇聚在一起进行PK。

本届Python挑战赛是在线上举行,参赛选手登录大赛官网在指定页面完成答题并提交答案。评定成绩的依据是同时考虑得分和用时两个方面,首先是得分高者名次靠前,如果得分一样,则用时少者名次靠前。

2023年全国青少年Python编程挑战赛华南赛区(海南)复赛于2023年7月8日正式举行。采取的仍然是在线考试,一共有6道题,全是编程题,考试时间是90分钟。

今天超平老师分享的是第6题,卡牌游戏。

二.题目说明

题目描述:

有 n 张卡牌。第 i 张卡牌的位置是 position[i]。

我们需要把所有卡牌移到同一个位置。在一步中,我们可以将第 i 张卡牌的位置从 position[i]改变为:

position[i] + 2 或 position[i] - 2,此时的代价 cost = 0

position[i] + 1 或 position[i] - 1,此时的代价 cost = 1

现给出所有卡牌的位置,请你编程输出将所有卡牌移动到同一位置上所需要的最小代价。

时间限制:1000ms

内存限制:256MB

输入描述:

输入一行正整数,每个数之间用空格间隔

输出描述:

输出将所有卡牌移动到同一位置上所需要的最小代价。

样例 1:

输入:

1 2 3

输出:

1

三.思路分析

卡牌游戏是我们生活中大家喜闻乐见的一种娱乐方式,相信大家都不会陌生。

图片

首先,我们要正确理解输入一行正整数的意思及卡牌的摆放方式,如果输入的是1、2、3,其摆放效果如下:

图片

如果输入的是1、2、2,其摆放效果如下:

图片

其次,我们要彻底读懂题目的意思。对于处在任意位置上的卡牌,有如下两种移动方式:     

  • 方式1:往前或往后移动2格,代价为0     

  • 方式2:往前或往后移动1格,代价为1

最终目标是花费最小的代价来将所有卡牌移动到同一位置,这里的同一位置可以是1 ~ n之间的任意位置。

很显然,我们可以使用贪心策略来解决这个问题,那什么是贪心策略呢?

先来看看经典名著《算法导论》是如何解释的?

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

举一个简单的例子,有一堆钞票,你可以拿走10张,如果想拿走最大数额的钱,那么要怎么拿?

图片

一定是每次拿面额最大的钞票,最终结果就是拿走数额最大的钱。每次拿面额最大的钞票就是局部最优,最后可以拿走最大数额的钱就是全局最优。

回到本题,为了确保代价最小,对于每一次的移动选择,如果能选择方式1(cost = 0),就绝对不选择方式2(cost = 1)。

因此我们可以通过方式1先将尽量多的卡牌移动到一起,在剩下的卡牌无法再通过方式1来移动到同一位置的时候,使用最少次数的方式2来移动。     

例如,对于样例1 2 3,先利用方式1,将position[3]位置上的K移动到position[1],此时的代价为0。

图片

现在剩下的两堆卡牌无法再通过方式1移动到一块,因此只能够使用方式2来移动。这样的移动选择有两种:

  • 使用方式1,将position[1]上的两张卡牌J和K移动到position[2],其总代价为2

  • 使用方式2,将position[2]上的卡牌Q移动到position[1],其总代价为1

很显然,使用后者可以让代价更小,也就是说,将所有卡牌移到第1个位置,其总代价为1。当然,这个位置并不是唯一的,如果都移到第3个位置,其总代价也为1。

对于3张卡牌的情形,相信你已经彻底弄明白了。如果有更多的卡牌,又该怎么移动呢?

根据上面的贪心策略,我们要尽量先使用方式1移动卡牌,那么方式1最多能移动多少张卡牌到同一个位置上呢?

答案是能够将所有奇数位置的卡牌移动到同一个位置,记作A,再将所有偶数位置的卡牌移动到同一位置,记作B。

并且A和B可以是任意两个相邻的位置,这就意味着两者的差为1。之所以要相邻,是因为相邻的位置移动的次数最少。

为方便说明,我们统一将奇数位置的卡牌移动到position[1],将偶数位置的卡牌移动到postion[2]。

例如输入的正整数为 1 2 3 4 5 6 7 8 9,即position = [1, 2, 3, 4, 5, 6, 7, 8, 9],如图所示:

图片

我们先通过方式1将其中所有奇数位置的卡牌(1,3,5,7,9)移动到位置position[1],如图:

图片

再将所有偶数位置的卡牌(2,4,6,8)移动到位置position[2],如图:

图片

如此一来,position[1]上共有5张卡牌,position[2]上共有4张卡牌。然后利用方式2将postion[2]上的4张卡牌全部移动到position[1]上,总代价就是4。

至此,我们可以总结规律如下:

所有奇数位置的卡牌都可以通过方式1移动到位置postion[1],所有偶数位置的卡牌都可以通过方式1移动到位置position[2],这个过程的总代价为0。

然后使用方式2将postion[1]和postion[2]两者中卡牌数量较少的那一堆移动到另一堆即可。

由此,我们可以得出最终算法如下:

1). 分别统计postion数组中奇数位置偶数位置的卡牌数量,分别用odd和even来表示;

2). odd和even的较小者就是最小代价。

接下来,我们进入具体的编程实现环节。

四.编程实现

根据上面的思路分析,使用贪心算法,编写代码如下:

图片

简单说明两点:

1). 对于用户输入的一行正整数,我们先将其按空格拆分,得到一个字符数字列表,类似于['1', '2', '3']这种,再通过int函数将其转成整数,这里使用了列表推导式的编程技巧;

2). 比较两个数字的大小,可以直接使用python自带的max和min函数。

五.总结与思考

本题代码不多,考查的知识点主要包括:

  • 处理输入数据;

  • 列表推导式;

  • for...in循环;

  • if...else双分支语句;

  • 取模运算符;

  • 贪心算法思想;

从代码的的角度来看,本题属于简单题目,但实际上,很多同学还没有走到这一步,在寻求解题思路的途中就已经迷路了😄。

本题的难点在于对问题的分析,其中,贪心算法是指导思想,拆分问题是方法。我们要坚信,一个复杂的问题,总是可以拆分成多个简单的问题。把每个简单的小问题解决了,那么整个问题也就解决了,这就是人们常说的结构化思维,也是编程学科提倡的计算思维。

通过这道题,相信你也感觉到了,学习少儿编程绝不是简单地编写几个程序,而是要运用逻辑思维来分析问题,借助数学思维来构建模型和算法,最后才是使用编程语言来实现,它是多个学科的完美融合。

学习编程能够培养孩子发现问题、分析问题并解决问题的综合能力,这种能力是未来社会最需要的一种能力。

你还有什么巧妙的解决方案吗,欢迎和超平老师交流。

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

查看更多教程,请移步至“超平的编程课”gzh。

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

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

相关文章

Leetcode 01-算法入门与数组-③数组排序

LeetCode 01-算法入门与数组-③数组排序 一. 冒泡排序 1. 冒泡排序算法思想 冒泡排序(Bubble Sort)基本思想: 经过多次迭代,通过相邻元素之间的比较与交换,使值较小的元素逐步从后面移到前面,值较大的元素…

Spring MVC常见面试题

Spring MVC简介 Spring MVC框架是以请求为驱动,围绕Servlet设计,将请求发给控制器,然后通过模型对象,分派器来展示请求结果视图。简单来说,Spring MVC整合了前端请求的处理及响应。 Servlet 是运行在 Web 服务器或应用…

玩转Nginx

Nginx是什么 Nginx(engine x)是一款的Web服务器、反向代理服务器,能够实现前端Web应用的部署、请求反向代理及负载均衡处理等功能。 特点 轻量,占用内存少高可靠高并发、高性能可扩展性好支持热部署BSD许可证(开源、可修改再发…

药品销售数据分析报告(报告资源-干货篇)

药品分析报告包含了药品研究分析报告、药品审评分析报告、药品市场分析报告、药品专利分析报告、药品上市分析报告、药品原料药分析报告、药品立项分析报告、药品投融资分析报告......所以我们在写作药品分析报告之前一定要明确需求者目的,如此方能针对核心内容进行…

Springboot登录验证的统一拦截处理

在进行Springboot项目开发的时候如何把每次请求都要验证的用户进行提取拦截统一处理 背景 如果不进行统一的拦截处理,其实这是一个非常痛苦的一件事情,因为每次用户请求你都要去进行用户的信息(用户信息存储在session中)的验证&…

【算法练习Day2】有序数组的平方长度最小子数组螺旋矩阵II

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 有序数组的平方暴力求解…

2023/9/20总结

maven maven本质是 一个项目管理工具 将项目开发 和 管理过程 抽象成 一个项目对象模型(POM) POM (Project Object Model) 项目对象模型 作用 项目构建 提供标准的自动化 项目构建 方式依赖管理 方便快捷的管理项目依赖的资源…

【SpringBoot项目】SpringBoot+MyBatis+MySQL电脑商城

在b站听了袁老师的开发课,做了一点笔记。 01-项目环境搭建_哔哩哔哩_bilibili 基于springboot框架的电脑商城项目(一)_springboot商城项目_失重外太空.的博客-CSDN博客 项目环境搭建 1.项目分析 1.项目功能:登录、注册、热销商品、用户管…

2023年8月京东户外鞋服市场(京东数据运营)

当前,户外活动的热潮使得户外鞋服市场备受青睐,带动了整个市场的高增长。 根据鲸参谋电商数据分析平台的相关数据显示,今年8月份,京东平台户外鞋服市场的销量为46万,同比增长约25%;销售额为9500万&#xf…

视觉检测系统可以检测太阳能电池片哪些方面的缺陷?

近年来,随着全球工业化进程的不断加快,能源与环境危机成为一个亟待解决的问题。为此,太阳能作为一种清洁可再生的能源,现已被广泛应用于各领域。太阳能电池片作为太阳能转换为电能的核心载体,其质量的好坏决定着电能的…

Cannot find module ‘core-js/modules/es6.regexp.constructor‘

npm run dev 之后报如下错误 解决方法:npm install core-js2 如果超时或者下载时间慢可以尝试 用cnpm install core-js2

【送书】实现可观测性平台的技术要点是什么?

文章目录 实现可观测性平台的技术要点是什么?兼容全域信号量所谓全域信号量有哪些?统一采集和上传工具统一的存储后台自由探索和综合使用数据总结 实现可观测性平台的技术要点是什么? 随着可观测性理念的深入人心,可观测性平台已经开始进入了落地阶段…

爸妈让我放弃百度,选择东软

作者:阿秀 InterviewGuide大厂面试真题网站:https://top.interviewguide.cn 这是阿秀的第「305」篇原创 小伙伴们大家好,我是阿秀。 目前已经是九月下旬了,秋招已经进入中后期了,很多公司已经开启秋招有一段时间了&…

C++实现WebSocket通信(服务端和客户端)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

【postgresql】替换 mysql 中的ifnull()

数据库由mysql 迁移到postgresql,程序在执行查询时候报错。 HINT: No function matches the given name and argument types. You might need to add explicit type casts. CONTEXT: referenced column: ifnull 具体SQL: SELECT ifnull(phone,) FROM c_user p…

mysql限制用户登录失败次数,限制时间

mysql用户登录限制设置 mysql 需要进行用户登录次数限制,当使用密码登录超过 3 次认证链接失败之后,登录锁住一段时间,禁止登录这里使用的 mysql: 8.1.0 这种方式不用重启数据库. 配置: 首先进入到 mysql 命令行:然后需要安装两个插件: 在 mysql 命令行中执行: mysql> INS…

软件项目管理【UML-类图】

前言 UML图有很多种,但是并非必须掌握所有的UML图,才能完整系统分析和设计工作。一般说来,在UML图中,只要掌握类图、用例图、时序图的使用,就能完成大部分的工作。也就是说,掌握UML的20%,就能做…

Vivado中增加源文件界面中各选项的解释

文章目录 官方解释结论总结验证增加单个.v文件增加文件夹Copy sources into project 参考文献 本文对Vivado中增加源文件界面Add or Create Design Sources和Add or Create Smulaton sources中的选项Scan and add RTL include files into project、Copy sources into project和…

影响软文效果的三大因素,一定要牢记

在信息技术发展速度越来越快的今天,企业宣传时已经不再局限于传统的硬广,开始利用软文来提升曝光率,软文作为一种全新的宣传手段,具有覆盖面广、成本低且持续时间长,但是有三大因素稍不注意就会影响软文发布的效果&…

八月份跳槽了,历经华为测开岗4轮面试,不出意外,被刷了...

大多数情况下,测试员的个人技能成长速度,远远大于公司规模或业务的成长速度。所以,跳槽成为了这个行业里最常见的一个词汇。 前几天,我看到有朋友留言说,他在面试华为的测试开发工程师的时候,灵魂拷问三小…