组合取球-2022年全国青少年信息素养大赛Python国赛第6题

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

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

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

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

一.赛事说明

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

2021-2022年全国青少年Python编程挑战全国总决赛于2022年8月27日正式举行。一共是10道编程题,每道题100分,满分1000分,考试时间是120分钟。

10道编程题分别如下:

  • 分苹果

  • 韩信点兵

  • 借书问题

  • 四位数密码

  • 邮票面值

  • 取球

  • 统计连续字符

  • n的n次方

  • 海盗搜身

  • 父与子

超平老师将分10讲对每道题进行详细的解读和剖析,今天要解读的是第6题,组合取球。

二.题目描述

题目背景:

一个箱子里面存放着50个球,其中10个红色,10个黄色,30个蓝色。

现在从箱子里面任意取n个球,计算并输出不同颜色的球的数量组合一共有多少种可能性。

输入描述:

一个数字n

输出描述:

一个数字,可能的组合总数

样例输入:

2

样例输出:

6

注意:

input()内不添加任何参数

只有完全正确才可提交,若无法点击提交说明答题存在错误,可及时进行检查并修改

三.思路分析

粗略一看,这是一个组合问题,但是这不是一个在m个小球中选n个小球的简单组合,而是从3种不同颜色的小球堆中选出n个小球的复杂组合。

针对此类组合问题,通常有两种解决思路,一是使用枚举算法,二是使用组合的方法。组合方法难度相对要大一些,枚举则是更简单的实现方式,这里重点介绍枚举算法的思路。

我们假定红色球选x个,黄色球选y个,蓝色球选z个,根据题目的描述,x、y、z满足如下条件:

x + y + z = n
0 ≤ x ≤ 10  
0 ≤ y ≤ 10   
0 ≤ z ≤ 30

x + y + z  = n 就是数学中的三元一次方程式,它有多组解,比如,当n = 2时,可以有如下不同组合:


x = 2 y = 0 z = 0
x = 0 y = 2 z = 0
x = 0 y = 0 z = 2
x = 1 y = 1 z = 0
x = 1 y = 0 z = 1
x = 0 y = 1 z = 1

可以将他们以元组的形式保存到列表中,如下:

[ (2,0,0),(0,2,0),(0,0,2),(1,1,0),(1,0,1),(0,1,1)]

针对3个变量,我们使用枚举算法,也就是3层循环就可以实现。

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

 

四.编程实现

根据上面的思路分析,我们编写代码如下:


# 获取数字n
n = int(input())
# 枚举算法
result = []
for x in range(10):for y in range(10):for z in range(30):if x + y + z == n and (x,y,z) not in result:result.append((x,y,z))
# 输出组合总数
print(len(result))

简单说明两点:

1). 为了避免重复组合,第9行代码做了去重处理;

2). 每一种组合,可以使用元组(x, y , z)来表示,也可以使用列表[x, y, z]来表示; 

运行程序,如果输入数字2,可以得到如下组合:

[(0,0,2),(0,1,1),(0,2,0),(1,0,1),(1,1,0),(2,0,0)]

如果输入数字3,可以得到如下组合:

[(0,0,3),(0,1,2),(0,2,1),(0,3,0),(1,0,2), (1,1,1),(1,2,0),(2,0,1),(2,1,0),(3,0,0)]

五.总结与思考

本题难度中等,考查的知识点主要包括:

  • 输入输出函数;

  • 循环嵌套语句;

  • 列表操作;

  • 枚举算法;

善于思考的同学可能已经发现了,题目描述中有一条信息可能会产生干扰作用,这就是“箱子里面存放着50个球”。有些同学在分析思考的时候,会纠结如何在50个小球中取n个小球的问题上。

实际上,50个小球分成了3堆,分别是10个红色球、10个黄色球和30个蓝色球,然后分别从三堆小球中取球,如此一来,就自然而然想到枚举算法了。

如果你熟练掌握了列表推导式的用法,上面的代码,还可以进一步进化,如下:

n = int(input())
result = [(x,y,z) for x in range(10) for y in range(10) for z in range(30)  if x + y + z == n]
print(len(result))

除此之外,还可以itertools库中的product函数来解决,你知道是怎么实现的,赶紧动手试一下吧。

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

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

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

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

相关文章

安全防御 --- DDOS攻击(01)

DOS攻击(deny of service)--- 拒绝式服务攻击 例:2016年10月21日,美国提供动态DNS服务的DynDNS遭到DDOS攻击,攻击导致许多使用DynDNS服务的网站遭遇访问问题,此事件中,黑客人就是运用了DNS洪水…

LinearAlgebraMIT_5_SpacesOfVectors

这一节中我们将学习向量空间。 x.1 转置矩阵和构造对称矩阵 在开启向量空间的学习前我们先复习一下转置矩阵和置换矩阵。我们将矩阵转置前后不变的矩阵称为对称矩阵。而我们如何得到一个对称矩阵呢,我们使用矩阵乘以矩阵的转置便可得到。 x.2 Vectors Space 向量…

如何执行Photoshop脚本

环境 Photoshop: CC2017 OS: Windows 10 脚本放置位置 C:\Program Files\Adobe\Adobe Photoshop CC 2015\Presets\Scripts #也就是 PS的安装目录\Presets\Scripts

探究Vue源码:mustache模板引擎(5) 对比rollup与webpack,在本地搭建webpack环境

好 从本文开始 我们就来手写一下mustache这个库 他是模板引擎的一个祖先 将模板字符串编译成一个dom字符串 就是它的思想,这也是一个具有跨时代意义的思想 这里的话 我们还是搭一个 webpack 的项目环境 这里值得一提的是 mustache 他官方是通过rollup来进行打包的 …

简述JMeter实现分布式并发及操作

为什么要分布式并发? JMeter性能实践过程中,一旦进行高并发操作时就会出现以下尴尬场景,JMeter客户端卡死、请求错误或是超时等,导致很难得出准确的性能测试结论。 目前知道的有两个方法可以解决JMeter支撑高并发: …

微信小程序学习之数据绑定,事件绑定,事件传参与数据同步的学习记录

数据绑定,事件绑定,事件传参与数据同步 1. 数据绑定1.1. 在data中定义数据1.2. 在wxml中渲染数据 (mustache语法) 2. 事件绑定2.1. 事件2.2. 常用的事件2.3. 事件对象的属性列表2.4. target 和 currentTarget的区别 3. 事件传参与…

订单结算页+下单业务

一、订单结算页 1.业务分析 (1) 获取用户收货地址信息 一般的收货地址都是多个,使用时选中一个,所以收货地址使用List集合封装 (2)获取购物车商品信息 购物车商品也是多个,使用List集合封装 (3)查询商品库存 查询每个商品是否有库存&#…

Scrap爬虫框架集成Selenium来解析动态网页

1、爬虫项目单独使用scrpay框架的不足 当前网站普遍采用了javascript 动态页面,特别是vue与react的普及,使用scrapy框架定位动态网页元素十分困难,而selenium是最流行的浏览器自动化工具,可以模拟浏览器来操作网页,解…

spring boot MySQL操作

极简spring boot MySQL测试 默认: spring boot环境已经搭好,可以跑最基本的hello world 有MySQL环境有部分测试数据表,并且有MySQL语法基础 配置 application.yml 如下配置,根据自己的数据库信息与个人需求配置 server: tomcat: uri-encoding: UTF-8 threads: …

使用Feign进行微服务之间的接口调用:Spring Cloud Alibaba中的声明式服务调用

一、Feign介绍 Feign是一个声明式的HTTP客户端框架,用于简化微服务架构中服务之间的通信。它是Spring Cloud框架的一部分,旨在提供一种优雅且易于使用的方式来定义和调用HTTP请求。 Feign的设计目标是让服务之间的通信变得更加简单和直观。通常情况下&am…

数据结构中队列的操作方式,一目了然

队列的概念 首先我们联想一下链表,在单链表中,我们只能对他的链表表尾进行插入,对链表的表头进行结点的删除,这样强限制性的链表,就是我们所说的队列。 也就是说,队列(queue)是限定…

代码随想录算法训练营第十二天 | 二叉树系列3

二叉树系列3 二叉树 看到二叉树就想到递归404 左叶子之和重点代码随想录的代码我的代码(当日晚上自己理解后写) 513 找树左下角的值重点代码随想录的代码我的代码(当日晚上自己理解后写)我去,我怎么能写出这样的代码,没有return的递归,大错特…