全国青少年信息素养大赛(原全国青少年电子信息智能创新大赛)是“世界机器人大会青少年机器人设计与信息素养大赛”赛事之一,由中国电子学会主办,包含很多赛项,大赛自2013年举办,已连续成功举办八届,已正式入围“2022-2025学年面向中小学生的全国性竞赛活动名单”。
大赛旨在激发广大青少年的科学兴趣和想象力,培养钻研探究、创新创造的科学精神和实践能力,促进青少年科技创新活动的广泛开展,发现和培养一批具有科研潜质和创新精神的青少年科技创新后备人才。
大赛主要竞赛类别包括电子科技、智能机器人、软件编程三类,全国青少年Python编程挑战赛就属于其中的软件编程类。
一.赛事说明
2021-2022年(第8届)Python挑战赛赛程分为初赛、复赛和总决赛三个阶段。初赛是资格赛,复赛是地方选拔赛,总决赛是全国各地选拔的精英汇聚在一起进行PK。2021-2022年全国青少年Python编程挑战全国总决赛于2022年8月27日正式举行。一共是10道编程题,每道题100分,满分1000分,考试时间是120分钟。
10道编程题分别如下:
- 分苹果
- 韩信点兵
- 借书问题
- 四位数密码
- 邮票面值
- 取球
- 统计连续字符
- n的n次方
- 海盗搜身
- 父与子
超平老师将分10讲对每道题进行详细的解读和剖析,今天要解读的是第3题,借书问题。
二.题目描述
题目背景:
小明家里有很多不同的趣味书籍,有3个好朋友每人来借—本书(同—本书一次不能借给两个人)
任意输入书籍的数量n(3<=n<=100),输出在所有的书籍中,找3本书给3个人有多少种不同的排列组合方法
输入描述:
任意输入书籍的数量n(3<=n<=100)
输出描述:
输出在所有的书籍中,找3本书给3个人有多少种不同的排列组合方法
样例输入:
3
样例输出:
6
注意:
input()内不添加任何参数
只有完全正确才可提交,若无法点击提交说明答题存在错误,可及时进行检查并修改
三.思路分析
借书是我们非常熟悉的场景,比如去学校图书馆借书。
这是一个典型的排列问题,排列是一个数学统计学(概率学)的概念。从n个不同元素中,取出m(m<=n)个元素,按照一定的顺序排成一列,就叫做从n个元素中取出m个元素的一个排列。
本题的意思就是从n本书中取出3本书,一共有多少种排列方法。针对排列问题,在Python编程中,通常有两种实现思路。
第一种思路是数学方法,可以分3次来取书,取法如下:
- 第1次,从n本书中任取一本,一共有n种,此时剩下n-1本书;
- 第2次,从n-1本书中任取一本,一共有n-1种,此时剩下n-2本书;
- 第3次,从n-2本书中任取一本,一共有n-2种,此时还剩下n-3本;
将三者相乘,就可以得到总的排列方法,即 n * (n – 1) * (n – 2)种。
第二种思路是使用Python编程中的itertools库, itertools是python的一个内置模块,功能强大,主要用于高效循环创建迭代器。
在itertools中,有两个常用的函数,分别是combinations和permutations,使用前者可以实现可迭代对象的全组合情况,而后者则可以实现可迭代对象的全排列情况。
接下来,我们进入具体的编程实现环节。
四.编程实现
根据上面的思路分析,我们可以使用两种方法来实现:
- 数学方法
- 排列函数法
1.数学方法
使用数学方法,代码如下:
# 方法1,数学方法
n = int(input())
print(n * (n - 1) * (n - 2))
2.排列函数法
使用排列函数方法,代码如下:
# 方法2,排列函数法
from itertools import permutations
n = int(input())
res = list(permutations(range(n),3))
print(len(res))
需要说明3点:
1). itertools是Python的内置模块,无需安装,但需要导入permutations函数;
2). 使用permuations函数需要传入两个参数,第一个是可迭代对象,第二个是整数,所以,这里需要使用range(n),而不是直接传入n;
3). permutations函数返回的是一个可迭代对象,通常需要转换成列表。
五.总结与思考
本题有一定的难度,考查的知识点主要包括:
- 输入输出函数;
- 排列的概念及实现思路;
- itertools模块的基本使用;
虽然题目有一定难度,但是代码很少,尤其是数学方法,只需要两行代码就实现了,从中也可以看出数学知识的强大和重要性了。排列组合在编程中是十分常见的一类题目,一定要掌握其实现思路。当然了,对于一些复杂的排列组合问题,还是需要借助combiations和permutations这两个强大的函数了,这也是超平老师在这里介绍它的原因,后面我们将多次使用这两个函数。给你留一个思考题,你知道组合和排列之间的区别吗?