绝密★考试结束前
2023年 6月浙江省普通高校招生选考科目考试
技术试题
姓名: 准考证号:
考生须知:
1.考生答题前,务必将自己的姓名、准考证号用黑色字迹的签字笔或钢笔填写在答题纸上。
2.选择题的答案须用 2B铅笔将答题纸上对应题目的答案标号涂黑,如要改动,须将原填涂处用橡
皮擦净。
3.非选择题的答案须用黑色字迹的签字笔或钢笔写在答题纸上相应区域内,作图时可先使用 2B铅
笔,确定后须用黑色字迹的签字笔或钢笔描黑,答案写在本试题卷上无效。
第一部分 信息技术(共 50分)
一、选择题(本大题共 12小题,每小题 2分,共 24分。每小题列出的四个备选项中只有一个是符合
题目要求的,不选、多选、错选均不得分)
1.下列关于数据和信息的说法,正确的是
A.在数据处理过程中不会有新的信息产生
B.信息的保存和传播可以不依附于载体
C.信息的价值因人而异,但信息不会有虚假
D.计算机中的数据表现形式不同,但都以二进制方式存储
【答案】D
【解析】
本题考查数据与信息的基本概念以及相关知识。
选项 A,信息是数据经过储存、分析及解释后产生的意义,所以数据处理的过程中,会有新的信息产生。
不会有新的信息产生,错误;
选项 B,信息是不能独立存在的,必须依附于一定的载体,即载体依附性。选项中的相应说法错误;
选项 C,信息是可以加工处理的,这一特征使信息有真伪性,存在虚假信息。说法错误;
选项 D,现代的计算机内部,数据只能以二进制的方式进行存储和处理。正确。
阅读下列材料,回答第 2至 4题:
某智慧课堂系统的部分功能是:教师进教室后刷校园一卡通实现身份认证并启动系统,学生进教室时
通过摄像头刷脸签到,签到结果保存在服务器的数据库中,系统可自动生成考勤报表。课堂教学时,教师
可将教学资源发送到学生的移动终端,学生可将作业文档上传到系统。可以现场录制教学视频并保存到服
务器,系统每天定时备份数据。
2.下列关于该系统功能和应用的说法,不.正.确.的是
A.该系统设计合理,不存在局限性
B.教学视频保存到服务器,有利于师生跨时空学习
C.该系统具有数据采集、处理和存储等功能
D.数据库可以用于存放该系统中的教师身份数据
【答案】A
技术(选考)试题 第 1 页(共 14 页)
【解析】
本题考查信息系统相关概念。
选项 A,信息系统天然存在一定的局限性,再合理的设计也无法完全避免。说法不正确;
选项 B,将教学视频保存到服务器,方便师生跨越时空进行学习,正确;
选项 C,根据材料的相关描述,智慧课堂系统,具备数据采集、处理和存储功能,正确;
选项 D,数据库存储教师(也可以包含学生等)身份数据,是合理的选择,正确。
3.该系统的下列应用中,体现人工智能技术的是
A.将现场录制的教学视频保存到服务器 B.系统自动生成考勤报表
C.学生进教室时通过摄像头刷脸签到 D.教师将教学资源发送到学生的移动终端
【答案】C
【解析】
本题考查人工智能的基础知识。
选项 A,体现信息系统中的基本数据的存储;
选项 B,体现信息系统中的基本数据处理;
选项 C,通过摄像头刷脸签到,这属于人工智能中的视觉识别技术,一般利用联结主义中的深度学习完成;
选项 D,体现信息系统中的数据的传输。
4.下列关于信息系统安全和信息社会责任的说法,正确的是
A.教师刷一卡通实现身份认证,能确保系统没有安全隐患
B.系统服务器若安装了杀毒软件,数据文件就不会被病毒侵害
C.系统每天定时备份数据,是保护数据安全的重要措施
D.未经授权,可将课堂教学视频放到电商平台出售
【答案】C
【解析】
本题考查信息系统安全和社会责任的相关概念和常识。
选项 A,教师刷一卡通实现身份认证可以提高信息系统的安全性,但却无法杜绝安全隐患问题;
选项 B,杀毒软件一般都是针对已知病毒,无法防范新型病毒的侵害。即便是之前出现过的计算机病毒,
也不能保证 100%查杀;
选项 C,定时备份数据,是保护数据安全的终于措施,正确;
选项 D,未经授权将课堂教学视频放到电商平台出售,侵犯了知识产权。
5.下列关于网络系统的说法,不.正.确.的是
A.局域网内部通信需要遵循网络协议
B.局域网内可以同时有无线通信和有线通信两种方式
C.校园网内可以搭建多个局域网
D.可用作服务器的计算机无法用作客户端
【答案】D
【解析】
本题考查网络相关的概念以及基础知识。
选项 A,网络协议是计算机网络正常工作的基础,局域网也不例外,正确;
选项 B,局域网通信方式既可以是有线也可以是无线方式,正确;
选项 C,局域网是有限范围内计算机通信网,校园网当然可以根据范围搭建多个局域网;
技术(选考)试题 第 2 页(共 14 页)
选项 D,服务器和客户端的称谓只是相对 B/S 或 C/S 这些工作架构的实际作用而言的,用作服务器的计算
机和普通计算机相比,并无本质不同(一般充当服务器的计算机软硬件性能稍高)。因此充当服务器的计
算机也可用作客户端。故选项 D不正确。
6.某智能手机安装了鸿蒙操作系统,其主板集成了处理器、存储器等芯片,下列说法正确的是
A.存储器可以存放用户数据而不能存放应用程序
B.鸿蒙操作系统是智能手机重要的应用软件
C.处理器性能是智能手机性能的唯一指标
D.智能手机硬件包括输入、处理、存储和输出等部分
【答案】D
【解析】
本题考查计算机硬件、软件与移动终端的组成相关知识。
A选项存储器的功能是存放程序和数据,因此 A选项错误;B选项操作系统是最重要的系统软件而不是应
用软件,因此 B选项错误;C选项智能手机的性能主要由处理器、存储器等部件的性能指标决定,因此 C
选项错误;D选项智能手机跟计算机一样,其硬件包括输入、处理(运算与控制)、存储和输出四个部分。
故答案选 D。
7.对某段声音进行数字化,量化值的范围是 0~200,则量化位数最少是
A.7 B.8 C.16 D.200
【答案】B
【解析】
本题考查声音量化、量化位数、进制转换相关知识。
量化指将信号的连续取值近似为有限个离散值的过程,量化值一般用二进制数表示,其二进制位数决定了
量化的精度,也称作量化位数。题干中已知量化值的十进制表示范围是 0~200,其二进制表示范围为
00000000~11001000,因此量化位数最少为 8位。故答案选 B。
8.某二叉树的树形结构如第 8题图所示,其前序遍历结果为 BDEFCA,则中序遍历结
果为
A.EDCFBA B.ECFDAB
C.BFDEAC D.EDFCBA
第 8题图
【答案】A
【解析】
本题考查二叉树的遍历相关知识。
前序遍历规则为“根左右”,已知前序遍历结果为 BDEFCA,结合第 8题图可知:
此二叉树第一次划分状态应为 B DEFC A , ,
根 左 右
技术(选考)试题 第 3 页(共 14 页)
再次根据前序遍历规则结合结构图,对左子树进行划分 D E FC , ,
根 左 右
最后重复上述划分过程,对 FC进行划分 F C , 。
根 左
根据完整的二叉树结构图,得出中序遍历为 EDCFBA。故答案选 A。
9.栈 s的最大长度为 3,初始为空,经过一系列入栈、出栈操作,若元素入栈的顺序是 a,b,c,d,e,f,
则可能的出栈序列为
A.f,e,d,c,b,a B.c,b,a,f,e,d
C.c,a,b,d,e,f D.c,e,d,b,a,f
【答案】B
【解析】
本题考查栈的入栈与出栈等相关知识。
此图作为一道验证出栈可能性的问题,需要结合题干的限制条件来进行,题干说明栈 s的最大长度为 3,初
始为空。
A选项 f最先出栈,说明 a,b,c,d,e,f需要全部入栈后,f才能出栈,但这种情况下栈长度需要为 6,
不符合题意,故 A选项错误;
B选项 c最先出栈,此时 a,b,c入栈,接着 c,b,a依次出栈,此时栈 s内为空,接下来 f出栈,说明 d,e,
f需要入栈,接着 f,e,d出栈,过程中栈内长度符合题意,故 B选项正确。
C选项 c最先出栈,此时 a,b,c入栈,接着 c出栈,此时栈内 a,b,由于 b是栈顶元素,所以接下来出栈元素
不可能是 a,故 C选项错误。
D选项 c最先出栈,此时 a,b,c入栈,接着 c出栈,此时栈内 a,b,接下来 e出栈,需要 d,e入栈,此时栈内
a,b,d,e,栈长度为 4,不符合题意,故 D答案错误。
故答案选 B。
10.定义如下函数:
def f(a,s):
if a>=s:
return a
else:
return f(a+1,s-a)
执行语句 k = f(6,21)后,k的值为
A.6 B.7 C.8 D.9
技术(选考)试题 第 4 页(共 14 页)
【答案】C
【解析】
本题考查递归算法及自定义函数知识。
观察自定义函数 f(a,s)可知:当参数 a≥s时(即递归结束条件),返回值 a;否则递归调用 f(a+1,s-a)。
执行语句 k = f(6,21),模拟计算过程如下:第一次调用函数 f(6,21);由于未达到递归结束条件,第二次调用
函数 f(7,15);未达到递归结束条件,第三次调用函数 f(8,8),满足递归结束条件 a≥s,返回值为 a,得到答案
8,故选 C。
11.列表 q长度为 20,q[0]至 q[4]的值依次为'p',' r',' i','n',' t',执行如下程序段后,输出的最后一个字符
为
head,tail= 0,5
while head < tail:
if head % 3 == 0:
print(q[head])
else:
q[tail] = q[head]
tail += 1
head += 1
A.t B.n C.i D.r
【答案】D
【解析】
本题考查单向顺序队列的基本操作(数组实现)。根据队列基本操作可知程序段的功能是:当队列 q 非空
时(空队列为 head == tail),根据头指针的索引位置(head % 3 == 0),分别执行“出队”操作或者“出队
并入队”操作,再结合题意,本题求解的是最后一个出队元素。用表格法模拟该队列头、尾指针和“出队”
操作的变化,如下表:
head tail 队列 q 出队字符
0 5 p,r,i,n,t p
3 7 n,t,r,i n
6 9 i,t,r i
9 11 t,r t
12 13 r r
综上所述,故选 D。
12.已排序的列表 a有 n个整型元素,现要查找出现次数最多的值并输出。若出现次数最多的值有多个,则
输出最前面的一个。实现该功能的程序段如下,方框中应填入的正确代码为
c,m,v =1,1,0
for i in range(1,n):
。
print(a[v])
技术(选考)试题 第 5 页(共 14 页)
A.if a[i]==a[i-1]: B. if a[i]==a[i-1]: C. if a[i]==a[i-1]: D. if a[i]==a[i-1]:
c+=1 c+=1 c+=1 c+=1
if c>m: if c>m: else: else:
m=c m=c if c>m: if c>m:
v=i v=i m=c m=c
else: else: v=i-1 v=i-1
c=1 c=1 c=1 c=1
【答案】A
【解析】
本题考查基本算法和数据结构的应用,涉及最值求解、已排序数组的相邻元素逻辑关系等知识。
由于列表 a 为有序列表,即有“值相同的数都是相邻的”这一逻辑关系,因此计算每个数的出现次数,可
以通过检查相邻两个数进行统计。观察程序段和选项中的代码可知:变量 v为次数最多的值在列表 a 中的
索引,变量 c为当前数值的出现次数,变量 m已统计次数中的最大值。其算法思想是:若相邻两个数相等,
则计数器 c加 1,否则应该将 c变为初值 1,首先可以排除选项 B,因为该选项中 else分支不符合逻辑。选
项 CD都存在缺陷,例如最多的一组相同的数出现在列表的最后时,均不能准确统计结果。例如 a= [2, 3, 3,
3, 4, 4, 4, 4, 4],此时输出值为 3,而正确结果为 4。本题选项 A逻辑结构合理,可以完成各种情况的统计任
务,故选 A。
二、非选择题(本大题共 3小题,其中第 13小题 7分,第 14小题 10分,第 15小题 9分,共 26分)
13.某仓库有一排连续相邻的货位,编号依次为 0~n-1,用于放置 A、B两种类型的箱子,A型箱子占 2个
相邻货位,B型箱子占 1个货位。编写程序,根据已完成的放置或搬离操作,输出空货位数及还可以放
置 A型箱子的最多数量(不移动已放置的箱子)。请回答下列问题:
(1)若 n为 10,开始时货位全空,经过如第 13题图所示的放置或搬离操作后,
不移动已放置箱子的情况下,还可放置 A型箱子的最多数量为 个。
(2)实现上述功能的部分 Python程序如下,请在划线处填入合适的代码。
# 读取货位总数,存入 n,代码略。
cnt1 = n
lst = [0]*n # 货位状态,0表示对应的货位为空
while True: 第 13题图
# 读取本次已操作的数据:箱子类型、操作类型、货位编号起始值,存入 t、d和 s,代码略
if t = = 'A':
w = 2
① :
w=1
else: # t不是'A'或'B'时退出循环
break
if d = = 'P': # d为 P时表示放置,否则表示搬离
②
else:
cnt1 + = w
lst[s]=1-lst[s]
if t = = 'A':
lst[s+1] = 1-lst[s+1]
技术(选考)试题 第 6 页(共 14 页)
i, cnt2 = 0,0
while i < n-1:
if lst[i] = = 0 and lst[i+1] = = 0:
③
cnt2 + = 1
i + = 1
print("当前空货位数: ' ,cnt1,',还可放置 A型箱子的最多数量: ' ,cnt2)
【答案】
(1) 2 或 “两” (1分)
(2) ①elif t = ='B' 或 elif t = =''B'' 或 elif t = ='''B''' 或 elif (t = ='B') (2分)
②cntl - = w 或 cntl = cntl - w (2分)
③i += 1 或 i = i + 1 (2分)
【解析】
本题考查 Python基础应用能力。
(1)10个空位放置情况如下图所示:
A型箱一个要占 2个相邻货位,最多可放 2个
①从初始 cnt1=n可以看出,cnt1是空货位数量。以下代码:
if d=='P': #d为 P时表示放置,否则表示搬离
②
else:
cnt1+ =w
可以看出,搬离时 cnt1+ =w,w变量为应搬离的数量,那么当 t=='B'时,搬离数量应为 1,故①处填:
elif t=='B'
搬离时空位加 w,则放置时空位减 w,②空填:cnt1-=w
③以下代码:
while i < n-1:
if lst[i]==0 and lst[i+1]==0:
③
cnt2+=1
i+=1
统计连续两个空位的个数,统计完后指针 i要向后跳 2,故③处填:i+=1
本题题意明确,设计较为巧妙,是一道不错的学选考过渡题。
14.小华要搭建书房环境监控系统,该系统能实现监测书房温度和湿度,出现异常时发出警报。用户通过浏
览器查看实时监测结果和历史数据。小华已选择的硬件有:智能终端、温湿度传感器、执行器(如蜂鸣
器)、服务器等,系统的硬件搭建方式是:服务器通过无线网络连接智能终端,智能终端连接传感器和
执行器,请回答下列问题:
(1)该系统中,智能终端与服务器之间的数据传输 (单选,填字母:A.只能由智能终端到服务器
端 / B.只能由服务器端到智能终端 / C.既可以由智能终端到服务器端,也可以由服务器端到智能终
技术(选考)试题 第 7 页(共 14 页)
端)。
(2)下列功能需要在智能终端程序中实现的是 (单选,填字母:A.采集温湿度传感器上的数据 /
B.处理浏览器访问请求)。
(3)小华基于 Falsk Web框架编写服务器端的程序,部分代码如下。编写完成后,若要通过浏览器获取
视图函数 index()返回的页面,则应访问的 URL是 http:// 。
# 导入 Falsk 框架模块及其他相关模块,代码略
app = Flask(__name__)
@app.route('/')
def index():
# 从数据库读取温度和湿度数据,并返回页面,代码略
# 服务器其他功能,代码略
if __name__ == '__main__':
app.run(host = '192.168.1.108', port = 5000)
(4)请通过增加传感器和执行器对该系统功能进行一项扩展,写出增加的传感器和执行器名称及实现的
功能。
(5)小华将系统中某天 24小时的湿度数据导出,部分数据如第 14题图 a所示(时间格式为“时:分:秒”),
分析每小时的最大湿度值,线形图如第 14题图 b所示,部分 Python程序如下:
第 14题图 a 第 14题图 b
import pandas as pd
import matplotlib.pyplot as plt
dft = pd.read_csv('data.csv') # 读取文件 data.csv中的数据
dft.insert(0, '小时', '') # 插入列
for i in dft.index:
t = dft.at[i, '时间'] # 通过行标签和列标签选取单个值
dft.at[i, '小时'] = t[0: 2]
dfh = dft.groupby( , as_index = False).max() # 分组求最大值
plt.plot(dfh['小时 '], dfh['监测值']) # 绘制线形图
# 设置绘图参数,显示如第 14题图 b所示的线形图,代码略
①请在程序中划线处填入合适的代码。
②小华分析线形图发现存在湿度值大于等于 100的噪声数据,要删除 dft对象中噪声数据,下列代
码段中,能正确实现的有 (多选,填字母)。
(注:全部选对的得 2分,选对但不全的得 1分,不选或有选错的得 0分)
A.dft = dft[dft[ '监测值'] < 100]
B.dft = dft[ '监测值'] < 100
C.n = len(dft[dft[ '监测值'] >= 100])
dft = dft.sort_values('监测值') #升序排序
dft = dft.tail(n) #获取尾部数据行
技术(选考)试题 第 8 页(共 14 页)
D.for i in dft.index:
if dft.at[i, '监测值'] >= 100:
dft = dft.drop(i) #删除行
【答案】
(1)C (1分)
(2)A (1分)
(3)192.168.1.108:5000/ 或 192.168.1.108:5000 (2分)
(4)增加气体传感器、LED指示灯,采集房间空气质量数据,并提示异常 或其他等价答案 (2分)
(5) ①'小时' 或['小时'] 或 dfh['小时'] (2分)
②AD (2分)
【解析一】
本题综合考查了基于 Flask Web框架和智能硬件的信息系统搭建。
第(1)题考察智能终端与Web服务器之间的数据传输。教材的信息系统搭建示例中,实现了智能终端通过
IOT模块以 GET或 POST的方式向服务器发送数据,服务器响应后,视图函数的返回值会回传到智能终端,
典型的如 errno, resp = Obloq.get(…)。代码中的 errno是服务器响应的错误代码,resp则是视图函数的返回值,
智能终端可以根据这个返回值做出一些其他操作。答案 C。
第(2)题与搭建信息系统的实践相关,考察学生真实的搭建系统经历。智能终端解决传感器与执行器的操
作问题,而浏览器的请求响应则由服务器解决,浏览器的请求与智能终端无直接的关系,所以此处答案为 A。
第(3)题是对 URL 完善,代码中,视图函数 index与路由“/”绑定,因此要调用 index函数则需要访问该
路由,完整的 URL由协议+IP+端口+路由组成,必要时可以设置 GET的参数。本题中,服务器运行在指定
的 IP和端口上,答案 http:// 192.168.1.108:5000/。
第(4)题要求对信息系统增加拓展功能。既然是室内环境检测,可以从温湿度、空气质量、光线强度等不
同角度思考,如增加光线传感器,发光二极管,当室内光线强度过低时开启二极管等。
第(5)①题考察 pandas中,DataFrame 对象的分组统计,groupby 函数对 DataFrame 对象的指定列进行分
组,参数是列标题,从图 b看,“小时”数据在横坐标轴上,因此以列标题“小时”进行分组。
第(5)②题考察数据筛选和删除,若只处理小于 100的值,可以通过筛选的方式复制出符合条件的数据的
副本(即 A选项),也可以删除不符合条件的数据(即 D选项)。B选项筛选格式书写错误,C选项升序
后应该删除尾部数据而不是获取尾部数据。
【解析二】
本题将 Pandas数据处理,matplotlib 数据可视化与 Flask Web框架、智能硬件信息系统搭建结合考查。
(1)智能终端通过 GET请求将传感器采集的环境温度发送到Web服务器,服务器则将数据传输状态返回
给智能终端,若数据传输错误,需要在智能终端显示相关错误信息,以供设计者观察并修正该错误,故智
能终端与服务器之间的数据传输是双向的
(2)传感器可将环境温、湿度等模拟量转化为数字量,带有传感器接口的智能终端则将这些数字量通过 IOT
模块传输给服务器,存储入服务器的数据库中,用户通过浏览器访问服务器中的网站,查询数据库中温湿
度数据,故此处选 A
(3)从代码中可知视图函数 index()所在的路由为根路由(“/”),故访问该视图函数的 URL 为:
http://192.168.1.108:5000/,地址末尾代表根路由的/可省略。
(4)答案不唯一,可以从光、声、气、温、湿等环境量着手答题,以下方案任选一种
传感器 执行器 实现功能
光敏传感器 电机 天亮拉开窗帘,天黑关闭窗帘
气敏传感器 电机 有异味开窗,无异味关窗
声敏传感器 LED灯 超过声音阈值 LED灯亮,未超过灯灭
技术(选考)试题 第 9 页(共 14 页)
温度传感器 电机 开空调制冷关窗,关空调开窗透气
湿敏传感器 电机 下雨关窗,天晴开窗
(5)dft = pd.read_csv('data.csv')用于读取文件 data.csv中的数据,此时 dft是包含 1列行索引和 3列数据(“时
间”、“类型”、“监测值”)的二维 DataFrame 结构,dft.insert(0, '小时', ''),则是在原 dft数据最左侧插入 1列
标题为“小时”,内容为空的数据列,注意,原来“时间”列索引为 0,插入“小时”后,“时间”、“类型”、“监测值”3
列依次向右移动 1列,插入后 dfh中就有 1列行索引和 4列数据列,for循环的作用是截取每行的“时间”列
的小时数据并存入“小时”列中,从图 b的横坐标标签“小时”可知,纵坐标表示各小时的最大湿度,故此处空
格应该求以“小时”作为分组对象,并求每个小时中最大的湿度值存入 dfh中,plt.plot(dfh['小时'], dfh['监测值
'])将取出分组后的 dfh中的“小时”和“监测值”两列数据做成线形图
(5)若要删除 DataFrame中的某行数据,通常做法是设置筛选条件留下符合条件的数据,如 A选项,dft =
dft[dft['检测值'] < 100];B选项的筛选格式书写错误。C选项中先算出噪声数据的行数 n,再对 dft进行升序
排序,那么排完后所有的噪声数据就在最后面,若把第 3行数据改成以下任意一种均正确
dft=dft.head(len(dft)-n) dft=dft[:-n] dft=dft[:len(dft)-n+1]
当然,此时你如果将 dft降序排序,又可以写出很多答案
D选项,则是采用枚举算法,逐行遍历,若监测值>=100,则将其删除,注意此时 drop中 axis没写,默认
是 0,表示删除行
15.某工程包含 n个任务(编号为 0-n-1),每天可以有多个任务同时进行。某些任务之间有依赖关系,如
第 15题图 a所示,任务 4依赖于任务 1,任务 1依赖于任务 2。即任务 2完成后才可以开始任务 1,任
务 1完成后才可以开始任务 4。不存在一个任务依赖于多个任务,或多个任务依赖于同一个任务的情况。
现已对该工程的依赖关系进行了梳理,结果如第 15题图 b所示,标记“T”表示依赖关系需保留,
标记“F”表示依赖关系需删除。
根据每个任务完成所需的天数和梳理后的依赖关系,编写程序,首先删除标记为“F”的依赖关系,
然后计算工程最快完成所需的天数,并以工程最快完成所需的天数为期限,计算每个任务最晚必须开始
的时间。
第 15题图 a 第 15题图 b
请回答下列问题:
(1)若某工程有 6个任务,任务间依赖关系如第 15题图 a所示,完成任务 0~5所需天数分别为 2,1,3,5,1,6,
则工程最快完成需要 天。
(2)定义如下 erase(lst)函数,参数 lst列表的每个元素表示一个依赖关系。函数的功能是删除标记为“F”
的依赖关系,返回保留的依赖关系的个数。
def erase(lst):
i=0
j = len(lst)-1
while i<= j:
if lst[i][2]== 'T':
i+=1
else:
if lst[j][2] == 'T':
技术(选考)试题 第 10 页(共 14 页)
lst[i]=lst[j]
i + = 1
j - = 1
return i
若 lst列表依次存储第 15题图 b所示的依赖关系,如 lst[0]为[0,5,'T'],调用 erase(Ist)的数,则语句
“lst[i] =lst[j]”的执行次数为 。
(3)实现上述功能的部分 Python程序如下,请在划线处填入合适的代码。
def proc(n, lst,task):
pr=[0]*n
w=[0]* n # w[i]存放任务 1最晚必须开始的时间
m=erase(lst)
for i in ① :
task[lst[i][1]][1] =lst[i][0]
pr[lst[i][0]] =1
c=[]
days= 0 # days存放工程最快完成所需的天数
for i in range(n):
if pr[i]==0:
k = i
s = 0
while k!= -1:
c.append(k)
s += task[k][0]
②
if s > days:
days=s
for i in range(n-1,-1,-1):
k =c[i]
if task[k][1] == -1:
w[k] = days-task[k][0]+1
else:
③
# 输出 days,以及保存在 w中的每个任务最晚必须开始的时间,代码略
'''
工程包含的任务数存入变量 n
任务间的依赖关系存入 lst列表
lst[0]包含 3项,任务 1st[i][0]依赖于任务 lst[i][1],lst[i][2]存放保留/删除标记,任务数据存入 task
列表
task[i]包含 2项,task[i][0]为完成任务主所需天数,task[i][1]的初值为-1
代码略
'''
proc(n,lst,task)
【答案】
技术(选考)试题 第 11 页(共 14 页)
(1)8 (1分)
(2)1 (2分)
(3) ①range(m) 或 range(0,m) 或 range(0,m,1) 或 range(m-1,-1,-1) 或 range(erase(lst))
或 range(0,erase(lst)) 或 range(0,erase(lst),1) 或 range(erase(lst) -1,-1,-1) (2分)
②k=task[k][1] 或其他等价答案 (2分)
③w[k]=w[task[k][1]]-task[k][0] (2分)
或 w[k]=w[c[i+1]]-task[k][0] 这里面可以把 k换成 c[i]
【解析一】
本题以多任务链为问题背景,考查数组的元素删除、链表的遍历、链表与索引数组的转化等操作。《数
据与数据结构课程标准》1.4小节提出:“通过案例分析,理解数组、链表等基本数据结构的概念,并能编
程实现其相关操作。比较数组、链表的区别,明确上述两种数据结构在存储不同类型数据中的应用。”本
题三个小题紧紧围绕这一内容,层层递进,步步设疑,衔接自然,全面、具体地考查了学生对数据与数据
结构中的核心概念、核心素养的理解与应用能力。
题意理解:
(1)任务分解:n个任务,需要根据彼此的依赖关系,将其分解为多个任务链。以图 a和图 b以及第(1)
小题提供的数据,可以分解为三个任务链:5→0;4→1→2;3。
(2)计算工程最快完成所需的天数。由于“每天可以有多个任务同时进行”,三个任务链可以分别独立、
同时进行,最快完成工程所需的天数,取决于耗时最长的任务链。由于三个任务链:5→0;4→1→2;3,
耗时分别为 8天、5天、5天,因此工程最快完成所需的天数为 8。
(3)以工程最快完成所需的天数为期限,计算每个任务最晚必须开始的时间。工程最快完成所需的天数为
8。例如对于任务链 5→0,任务 0完成需要 2天,则至少需要从倒数第 2天开始,即顺数第 8-2+1=7 天开始,
对于任务 5完成需要 6天,则至少需要从倒数第 2+6天开始,即顺数第 8-(2+6)+1=(8-2+1)-6=7-6=1天
开始。
弄懂了以上数据处理方法,则本题三个小题的填空都迎刃而解。详解如下:
第(1)小题:
考查题意的理解与应用,按上述分析,答案应为 8。
第(2)小题:
以删除数组中其中标记为“F”的数据元素为背景,考查双指针技巧。
函数中设置了两个指针 i,j,分别指向列表 lst的首、尾元素,先检查 i所指元素中是否标记为“T”,
若是则保留该元素不动,i后移一个位置(i = i + 1);否则 i所指元素应当删除:①此时需检查尾指针 j,所指
元素标记若为“T”,则可以将尾元素覆盖至首指针 i所指元素,然后 i后移一个位置(i = i + 1),②不管尾
元素是否标记为“F”,j都向前移动一个位置(j = j-1)。执行函数结束时状态如下图所示:
任务 A 任务 B 标记
0 5 T
1 2 T
j
4 1 T
1 2 T i
2 3 F
图 c
技术(选考)试题 第 12 页(共 14 页)
模拟此过程,运行结束时 i为 3,j为 2。语句"lst[i] =lst[j]"只在 i=1,j=3时执行 1次,故“lst[i] =lst[j]”
的执行次数为 1,erase(lst)函数返回值为 i,i变量正好代表了剩余的元素个数,即保留下来的标记为“T”
的元素个数。故本空的答案为 1。
第(3)小题:
完成本题的关键是:把握输入数据是哪些、各数据元素的含义是什么、划分程序模块弄清其功能。首
先记好工程包含的任务数为变量 n;任务间的依赖关系储存在 lst 列表,其中 lst[i]包含 3 项,任务 1st[i][0]
依赖于任务 lst[i][1],lst[i][2]存放保留/删除标记;任务数据存入 task 列表,task[i]包含 2项,task[i][0]为完
成任务所需天数,task[i][1]的初值为-1。
在函数 proc(n, lst, task)中,任务链的构造主要靠 task[i][1]来标记链表指针,任务链的表头依靠标记数
组 pr来进行,pr[i]为 0时表示此元素为任务链的头节点,pr[i]为 1时表示此元素为中间节点或尾节点。
程序模块一即第一个 for循环任务是构造任务链。如图 c所示,这一过程排除了孤立的任务,重点在于
把彼此依赖关系的任务的链接关系构造起来。lst中已经删除了标记为“F”的依赖关系,erase(lst)函数返回
值为 i,正好代表了剩余的元素个数,所以①空应填写 range(m)或等价表达式。
程序模块二即第二个 for循环任务是计算工程最快完成所需的天数。把所有任务链(包括孤立的任务)
的完成时间都计算出来,取最大值。语句 if pr[i]==0是判断是否任务链的头节点,然后 while 循环开始计算
各任务链的完成时间s,用s和 days中的较大值以更新 days。②空是链表遍历的常规操作:k=task[k][1]。
程序模块三即第三个 for循环任务是计算每个任务最晚必须开始的时间。关键在理解模块二中c数组的
作用。按所有任务链(包括孤立的任务)的头节点索引大小顺序,保存各个任务链。模拟过程,可知 c数
组中的数据依次为 2、1、4,3,5,0,可见 c数组是一个索引数组,且尾元素一定为任务链的尾节点。出
于计算效率的考虑,可以从 c数组的末尾开始处理更方便。依照上述题意理解(3)的分析,task[k][1] ==
-1 表示任务 k 一定是任务链的尾节点,它至少应该从倒数第 task[k][0]天开始,或者顺数第
days-task[k][0]+1 开始;否则 task[k][1] != -1,即任务 k 一定不是尾节点。由于 c 数组的特点,任
务 k 所在任务链的后一个任务已经计算完成,所以第③空答案应为 w[k]=w[c[i+1]]-task[k][0]或等价表
达式。
【解析二】
(1)分析题目,根据 6个任务之间的依赖关系将所有任务分为三组分别是【5,0】、【4,1,2】、【3】,
根据题意三组任务可以同时进行,分别计算三组任务完成的时长,取最大值即为工程最快完成时间。已知
第一组的两个任务需要 8天、第二组的三个任务需要 5天、第三组一个任务需要 5天。
(2)erase(lst)函数用于删除 lst列表中标记为删除的任务。该函数遍历 lst列表,通过两个指针 i和 j,分别
指向列表的头部和尾部。当 lst[i][2]为'T'时,表示该任务需要保留,指针 i向后移动一位。当 lst[i][2]不为'T'
时,表示该任务需要删除,将 lst[i]替换为 lst[j],然后指针 i向后移动一位,指针 j向前移动一位。最后返回
指针 i的值,即删除后的列表长度。语句"lst[i] =lst[j]"只在 i=1,j=3 时执行 1次。
(3)自定义函数 proc(n, lst, task),用于处理任务调度。首先,创建了两个长度为 n的列表 pr和 w,用于存
放任务的状态和最晚开始时间。然后调用 erase(lst)函数,将删除后的列表长度存入变量 m中。
for i in ① :
task[lst[i][1]][1] =lst[i][0]
pr[lst[i][0]] =1
上述代码段通过遍历删除后的列表(第①空的答案为 range(m)),更新任务的状态和最晚开始时间。对于
每个删除后的任务 lst[i],将 lst[i][0]作为任务的编号,将 lst[i][1]作为任务的前置任务编号,将 lst[i][0]作为
任务的主任务编号。并将 pr[lst[i][0]]设置为 1,表示该任务有前置任务。
空列表 c,用于存放可以进行的任务序列。变量 days用于存放工程最快完成所需的天数。接下来,遍
历任务列表,对于每个任务编号 i,如果该任务的前置任务编号为 0,则将其作为起始任务,进行任务序列
完成时间的计算。在计算过程中,将当前任务编号 k添加到列表 c中,累加任务的完成时间 s,并将当前任
技术(选考)试题 第 13 页(共 14 页)
务的主任务编号 task[k][1]作为下一个任务的前置任务编号 k,所以第②空的答案为 k=task[k][1]。
最后,如果累加完成时间 s大于 days,则更新 days的值。
接下来,通过倒序遍历任务列表,计算每个任务的最晚开始时间。对于每个任务编号 k,如果该任务没
有后续任务(即 task[k][1]为-1),则将最晚开始时间 w[k]设置为 days-task[k][0]+1,表示该任务必须在工程
最快完成时间内开始。否则,将最晚开始时间 w[k]设置为其后续任务的最晚开始时间减去当前任务完成时
间,表示该任务必须在其后续任务完成前开始。所以第③空的答案为 w[k] = w[task[k][1]]-task[k][0]。
技术(选考)试题 第 14 页(共 14 页)