资源简介 6.2 采用枚举算法处理已有数据学习目标 1.基于生活中的问题设计情境,掌握分析问题、抽象建模、设计算法、编写程序的过程。2.掌握利用算法解决问题的思维能力构建。(2023年6月浙江选考)某仓库有一排连续相邻的货位,编号依次为0~n-1,用于放置A、B两种类型的箱子,A型箱子占2个相邻货位,B型箱子占1个货位。编写程序,根据已完成的放置或搬离操作,输出空货位数及还可以放置A型箱子的最多数量(不移动已放置的箱子)。请回答下列问题:箱子类型 操作类型 货位编号B 放置 5A 放置 2,3B 放置 0A 放置 7,8A 搬离 2,3(1)若n为10,开始时货位全空,经过如题图所示的放置或搬离操作后,不移动已放置箱子的情况下,还可放置A型箱子的最多数量为 个。 (2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。#读取货位总数存入n,代码略。cnt1=nlst=[0]*n #货位状态,0表示对应的货位为空while True: #读取本次已描过数据:箱子类型、操作类型、货位编号起始值存入t,d和s,代码略 if t=="A": w=2 ① : w=1 else: #不是"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] i,cnt2=0,0 while i if lst[i]==0 and lst[i+1]==0: ③ cnt2+=1 i+=1 print("当前空货位数",cnt1,",还可放置A型箱子的最多数量:",cnt2)答案 (1) 2或两 (2)①elif t=="B" 或elif t=="B"或elif t=="'"或elif (t=='B') ②cnt1-=w或cnt1=cnt1-w ③i+=1或i=i+1解析 本题考查列表的遍历。(1)经过放置或搬离操作后,索引位置1-4是空的,6和9是空的,因此可以放置A型箱子2个。(2)①w是两种箱子所占货位,因此当输入是B是占位为1。②cnt1当前空货位数,d为P时表示放置,否则表示搬离,条件不成立时,空位增加,因此条件成立时,空位减少。③cnt2表示还可放置A型箱子的最多数量,当条件lst[i]==0 and lst[i+1]==0成立时,表示可以放置A类型,因此下一个货位要跳过。 抽象和建模是用程序实现算法前的重要步骤,抽象找出影响问题的主要因素,明确已知什么和求什么。建模是描述主要因素之间的关系,一是明确方法,往往采用遍历列表的方法;二是明确步骤,往往是求符合条件的和、个数、最值和平均值。枚举算法简称枚举法,也称为列举法、穷举法,是暴力策略的具体体现,又称为蛮力法,在遍历过程中求值与条件进行比对的过程。枚举法的基本思想是:逐一列举问题所涉及的所有情形,并根据问题提出的条件检验哪些是问题的解,哪些应予排除。例1 某公司有编号为0至n-1的n个会议室。每个预定的会议包含开始时间和结束时间,都会在未占用且编号较小的会议室举办,如果没有可用的会议室,会议将会延期到有空闲的会议室为止,并且优先提供给原开始时间最早的会议。编写python程序,求举办最多次会议室。请回答下列问题:(1)若会议室n为2,会议如图所示,编号为1(即第2个)会议室承办的会议次数为 。 会议序号 开始时间 结束时间会议1 0 30会议2 5 10会议3 15 20会议4 17 35(2)请完成下面划线处的代码。#读取会议室数量存存储到变量n。#读取会议到列表meetings中,每个元素包含会议开始时间和结束时间,并按开始时间排序,代码略。cnt=[0]*ntim=[0]*n #存储当前每个会议室承办会议的结束时间for m in meetings: best=0;i=0 while i if tim[i]<=m[0]: ① tim[i]=m[1] break if tim[i] i+=1 if i==n: cnt[best]+=1 ② ans=0for i in range(1,n): if ③ : ans=iprint("承办会议最多的会议室编号为:",ans)思维点拨明考向 本题考查列表的遍历和最值的查找精点拨 (1)会议室1承办会议1,30结束,会议室2承办会议2,10结束,承办会议3,20结束,承办会议4,38结束,因此会议室承办3个会议。(2)①遍历每个会议,tim存储当前每个会议室承办会议的结束时间,若某个会议室结束时间小于等于当前会议开始时间,表示该会议室可以承办该会议,该会议室的承办次数增加1次。②best记录了最早结束会议的会议室索引,若条件i==n成立,表示没有找到结束时间早于当前会议开始的会议室,那么让结束会议最早的会议室承办,该会议室会议结束时间更新为上次会议结束时间和本次会议所需时间之和(当前会议结束时间减去开始时间)。③cnt记录每个会议室承办会议的次数,ans表示承办会议最多的索引(编号),遍历所有会议室,若当前会议室承办会议次数cnt[i]大于cnt[ans],将承办会议最多的会议室编号更新为ans答案 (1)3 (2)①cnt[i]+=1 ②tim[best]+=m[1]-m[0] ③cnt[ans]变式1 有n列砖组成的一面砖墙,每列砖由数量不等的砖块组成,每块砖的长宽高都为1。小明为了美化这面墙,需要在这面墙中找到一块面积最大的矩形用于涂鸦。如图a所示,有6列高度依次为2、1、5、6、2、3组成的砖墙,图b和图c是其中的两种方案。编写Python程序,找出面积最大的矩形,并输出其位置和面积。(1)结合图a,这面墙中可用于涂鸦的最大的矩形面积为 。 (2)实现上述功能的Python代码如下,请在划线处填上合适的代码。#数组num中依次存放各列砖墙的高度,代码略maxs=0;n=len(num)for i in range(n): minh=num[i] for j in ① : if minh>num[j]: minh=num[j] ② if s>maxs: ③ start=i+1 end=j+1print("起止砖列编号为:",start,end,",最大面积为:",maxs)答案 (1) 10 (2)①range(i,n) ②s=minh*(j-i+1) ③maxs=s解析 本题考查根据题意建模,代码的分析理解能力。(1)由高度5和6组成的矩阵面积为10,达到最大值。(2)①从当前砖头i开始,不断地向后遍历。②矩形面积取决于宽度和高度,变量i,j表示宽度的开始和结束位置,向后查找构成矩形的最小高度minh,根据宽度j-i+1计算对应的面积;③更新最大面积maxs的值为s。例2 徐老师设计了一个德育考评系统,学生每天按时到校得1分,若能连续5天都按时到校,则连续按时到校的这几天共可获得1+2+3+4+5分,连续按时到校超过5天,第5天之后的每天得5分,迟到得0分,若学生平时表现良好,可以获得一次消除迟到记录的机会,如下图所示,某学生的到校数据为“YYNYYYNY”,其中“Y”表示按时到校,“N”表示迟到。徐老师设计相应的程序,找到消除迟到记录后总分最大的一种方案并进行修改,若有相同结果,则选择最早的一条记录进行修改。如图中消除前德育考评总分为10分,消除第3天迟到记录后,德育考评总分为21分。日期 第1天 第2天 第3天 第4天 第5天 第6天 第7天 第8天打卡状态 Y Y N Y Y Y N Y德育分数 +1 +2 +0 +1 +2 +3 +0 +1消除后打卡状态 Y Y Y Y Y Y N Y消除后德育分数 +1 +2 +3 +4 +5 +5 +0 +1(1)某位同学的到校记录为“NYYNYYNY”,则消除一次迟到记录后德育考评总分最大为 。 (2)实现上述功能的程序如下,请在划线处填入合适的代码。def cal(data): #根据学生到校记录data,计算出相应的德育考评总分,代码略data=input("输入有迟到记录的学生到校数据")score=cal(data)print("原德育成绩是",score)check=[0]for i in range(len(data)): if ① : check.append(i)check.append(len(data))t=0;maxt=0for i in range(1,len(check)-1): before=cal(data[check[i-1]:check[i+1]]) after=cal(data[check[i-1]:check[i]]+"Y"+data[check[i]:check[i+1]]) ② if temp>maxt: maxt=temp;t=iprint("消除的位置是第",check[t]+1,"天,德育考评总分是",③ ,"分") 思维点拨明考向 本题考查列表的遍历精点拨 程序的功能是统计各个“N”的位置到check数组,以记录中间连续Y的位置,再遍历check数组,若仅仅将当前N改为Y,那么check[i-1]和check[i+1]就是连续的Y,统计修改前后的差值,并找出最大的差值maxt,就是要修改的地方t。(1)将第2个N修改为Y,修改后为“NYYYYYNY”,得分为0+1+2+3+4+5+0+1=16。①遍历data数组,若当前位置的值data[i]为"N",就记录该位置到check中。②统计前后data[check[i-1]和check[i+1]两段的积分值,并计算修改前后的差值。③考评总分为原来的得分加上前后的差值答案 (1)16 (2)①data[i]=="N" ②temp=after-before ③maxt+score变式2 某城市外环线公路限速80千米/小时,有若干个十字路口。现在有一辆车距离第1个路口1000米处匀速出发,且此时所有路口的红绿灯刚好从红灯跳到绿灯。编写程序,计算可以连续通过最多绿灯路口的最高车速。请回答下列问题:(1)若共有3个路口,每两个路口之间的距离均为1000米,车子通过路口的时间忽略不计,每个路口的红绿灯持续周期时间均为60秒,其中第0-30秒为绿灯,可以通行。车子以下列速度能连续通过3个路口的是 (单选,填字母)。 A.15米/秒(54千米/小时)B.20米/秒(72千米/小时)C.25米/秒(90千米/小时)(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。#读取车子距离第1个路口距离以及每两个路口之间的距离存入dis列表中,代码略。#读取各路口红绿灯周期时间存入towtime列表中,代码略。ansx,ansy=0,0for speed in range(40,81): curtime,cout,imax=0,0,0 tspeed=int(speed*1000/3600) #速度转换为米/秒 for i in ① : curtime+=int(dis[i]/tspeed) tmp=curtime % towtime[i] if ② : cout+=1 if cout>imax: imax=cout else: ③ cout=0 if ④ : ansx=imax;ansy=speedprint("车速为"+str(ansy)+"千米/小时,可最多连续通过"+str(ansx)+"个路口")答案 (1)A (2)①range(len(dis)) 或range(len(towtime)) ②tmp<=towtime[i]//2③curtime+=towtime[i]-tmp ④imax>=ansx解析 本题考查利用程序设计解决生活实际问题。(1)A选项到达第1个路口时间为1000/15,约为67秒,绿灯第2次亮起。到达第2个路口时间为1000/15,约为133秒,除60的余数为13秒,绿灯亮起。到达第3个路口时间为3000/15,为200秒,除60的余数为20秒,绿灯亮起。B选项到达第1个路口时间为1000/20,值为50秒,红灯。C选项超过速度限制。(2)①遍历经过各个路口的距离。②curtime表示到达该路口的时间,curtime除以经过当前路口的红绿灯周期时间towtime[i]的余数在前一半,那么就可以绿灯通过。③计算可以连续通过最多绿灯路口的最高车速,若有多个最大值,当speed越大,就是所求的值。1.世界卫生组织认为成年人正常血压标准:收缩压在90-140之间并且舒张压在60-90之间(包含端点值)。现有监测到的连续若干天的血压值,编程计算正常血压持续的最长天数并输出起止日期,若有多段最长天数,则输出最后一段的起止日期。(1)某段时间测量的血压值如图所示,则正常血压持续的最长天数为 。 (2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。日期 收缩压 舒张压9月1日 130 939月2日 132 879月3日 133 859月4日 128 789月5日 152 919月6日 125 86#数组a中保存每天监测到的血压值,a[2*i]和a[2*i+1]分别表示第i 天的收缩压和舒张压,数组b保存日期数据,代码略;n=len(a)t,ans,end=0,0,0for i in range(n//2): if 90<=a[2*i]<=140 and 60<=a[2*i+1]<=90: t+=1 if ① : ans=t end=i else: ② print("正常血压持续的最长天数为:",ans)beg=③ print("起止日期:",b[beg],"--",b[end])答案 (1)3 (2)①t>=ans 或 ans<=t②t=0 ③end-ans+1解析 (1)9月2日至4日,共计3天。(2)①若有多段最长天数,则输出最后一段的起止日期,当t等于最大值时,取后者。②不符合要求时,将t初始化为0。③根据结束时间和最长天数,计算开始时间。2.某单位打印室有4台打印机(编号0~3),根据打印任务的紧急程度分为加急任务和普通任务,两种任务的分配规则如下:△任务甲为加急任务,优先分配: 先选择当前空闲的打印机(同空闲状态则编号小的优先) 若无空闲打印机,则选当前任务剩余时间最短的打印机(同剩余时间则编号小的优先)△任务乙为普通任务,按打印机累计打印份数分配,选择累计打印份数最少的打印机(同打印份数则打印机编号小的优先)(1)某时刻各打印机状态:打印机0:空闲(累计200份) 打印机1:忙碌,剩余8分钟(累计160份)打印机2:忙碌,剩余6分钟(累计160份) 打印机3:忙碌,剩余8分钟(累计200份)此时到达一个打印任务,下列选项中任务和分配的打印机相匹配的是 (单选,填字母)。 A.乙,打印机0 B.乙,打印机1C.甲,打印机2 D.甲,打印机3(2)以下python代码段实现打印任务的分配,请在划线处填入合适代码。(3)加框处代码有误,请改正。#[False,0,200]表示打印机状态(空闲),当前任务剩余时间,累计打印份数printer=[[True,6,200],[True,5,150],[True,8,150],[True,3,220]]#获取task值,如[True,20]表示任务属性(甲)与需打印份数,代码略def assignmen_task(printer,task): if task[0]: k=0 for i in range(len(printer)): if ① : #更新打印机状态与累计打印份数,代码略 return printer,i elif ② : k=i else: k=0 for i in range(1,len(printer)): if printer[k][2]>=printer[i][2]: k=i #更新打印机状态与累计打印份数,代码略 return printer,k答案 (1)B (2)①not printer[i][0]②printer[k][1]>printer[i][1](3)printer[k][2]>printer[i][2]解析 (1)甲为加急任务,先选择当前空闲的打印机0,乙是普通任务,应选打印份数最少的打印机1。(2)task[0]表示任务属性甲,即加急任务,枚举各个打印机的打印任务,找到相应的打印机。①先选择当前空闲的打印机(同空闲状态则编号小的优先),因此找到第一个打印机状态printer [i][0]是空闲,其值为False,则返回打印任务和打印机编号。②若无空闲打印机,则当前打印任务的时间printer[i][1]与剩余时间最短的打印机时间printer[k][1]比较,找到相应的打印机编号。(3)任务乙为普通任务,按打印机累计打印份数分配,选择累计打印份数最少的打印机,当两个打印份数均为最小时,选择打印机编号小,因此不能包含等号。3.某快递分拣站有4个分拣机器人(编号0~3),根据包裹重量分为优先包裹和普通包裹,两种包裹的分拣规则如下:①重量≥10kg的包裹为优先包裹,优先分配: 先选择当前空闲的机器人(同空闲状态则编号小优先) 若无空闲机器人,则选当前任务剩余时间最短的机器人(同剩余时间则编号小优先)②重量<10kg的包裹为普通包裹,按机器人累计分拣件数分配,选择累计分拣件数最少的机器人(同分拣件数则编号小优先)(1)某时刻状态:机器人0:空闲(累计200件);机器人1:忙碌,剩余8分钟(累计150件);机器人2:忙碌,剩余5分钟(累计150件);机器人3:忙碌,剩余8分钟(累计220件)。此时到达一个包裹,下列选项包裹重量和分配的机器人相匹配的是 (单选,填字母)。 A.3kg,机器人0B.5kg,机器人1C.10kg,机器人2D.15kg,机器人3(2)请完成划线处的代码。以下Python代码段实现优先包裹的分配:#[False,0,200]分别表示机器人状态(空闲),当前任务剩余时间,累计分拣件数robots=[[False,0,200],[True,5,150],[True,8,150],[True,3,220]]def assign_urgent(): for i in range(4): if ① : #更新机器人状态和累计分拣件数,代码略 return i #直接分配空闲机器人 k=0 for i in range(1,4): if ② : k=i ③ #更新累计分拣件数 return k答案 (1)B (2)①not robots[i][0]或robots[i][0]==False ②robots[i][1]③robots[k][2]+=1解析 (1)A选项包裹重量为3 kg,则分配给累计分拣数最少的机器人1;B选项包裹重量为5 kg,则分配给累计分拣数最少的机器人1;C选项包裹重量为10 kg,则分配给当前空闲机器人0;D选项包裹重量为15 kg,则分配给当前空闲机器人0。(2)①若当前有空闲机器人时(状态为False时),将包裹分配给空闲机器人。②a若不存在空闲机器人,则需要依次遍历每个机器人的当前任务剩余时间,找到最小值k。③此时k为当前选中的机器人,则要让其分拣次数robots[k][2]加1。4.小明为了研究生物实验室微生物培养皿中适宜的温度数据,通过从服务器数据库导出某培养皿中温度传感器采集到近24小时内全部的温度数据,查找当日温度连续不高于设定阈值(25 ℃)的最长时间段(若含有多段长度相同的最大值,输出最早的一个时间段)。(1)若采集到的时间点和温度数据用数组a 来表示,a[0][0]是第一个采集时间点,a[0][1]是第一个温度值,则[[1,21],[2,24],[3,25],[4,26],[5,22],[6,23]]中符合要求的最长时间段是 (单选,填字母:A.1至4/B.1至3/C.5至6)。 (2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。#获取采集到的温度数据,用数组a存放,代码略s=25;maxlen=0;n=len(a)start=end=0i=0while i if a[i][1]<=s: ① for j in range(i+l,n): if ② : break c=c+1 if c>maxlen: maxlen=c;start=i end=③ i=i+c else: i=i+1print("最长时间段为",a[start][0],"至",a[end][0])答案 (1)B (2)①c=1 ②a[j][1]>s 或a[j][1]>25 ③i+maxlen-1 或i+c-1 或start+c-1 或start+maxlen-1解析 (1)符合要求的最长时间段为21、24、25,即1至3。(2)①遍历数组a,若当前温度a[i][1]小于等于s,c记录连续的天数,因此c的值为1。②变量j从i+1开始不断地向后查找,若遍历到的温度a[j][1]大于s,则找到一段连续不大于s的温度的日期。③变量i的连续的开始位置,其长度为maxlen,因此结束位置为i+maxlen-1。5.七段数码管常用于显示数字,如图a所示。给每段数码管编号,通过点亮不同的段显示不同的数字。例如,数字0需要点亮A,B,C,D,E,F段,数字1需要点亮B,C段。数码管经常发生故障:常亮和不亮。系统会根据运行日志判定数码管是否发生故障,如图b所示,日志由多行字符串组成,每行字符串中第一个字符为显示的数字,后为亮起的数码管编号。例如,“1BC”表示显示数字1时,B、C段亮起。日志中可能有同一个数字的多次记录,但不会自相矛盾。编写程序,用7个字符来标示数码管的检测结果。对于每一段,如果有证据表明它常亮,标记为“X”,若有证据表明它不亮,标记为“x”,若正常,标记为“0”。(1)某段日志如图b所示,则检验结果为 (单选,填字母)。 A.x00X000 B.x00x000C.X00x000 D.X00X000(2)实现上述功能的python程序如下,请在划线处填入合适的代码。check=[[1,1,1,1,1,1,0],[0,1,1,0,0,0,0],[1,1,0,1,0,1,1],[1,1,1,1,0,0,1],[0,1,1,0,1,0,1],[1,0,1,1,1,0,1],[1,0,1,1,1,1,1],[1,1,1,0,0,0,0],[1,1,1,1,1,1,1],[1,1,1,1,1,0,1]]#check标记每个数字应点亮的段ans=['0']*7f=open("log.txt");line=f.readline().strip()while line: t=① L=len(line);a=[0]*7 for j in range(1,L): a[ ② ]=1 for j in range(7): if ③ : ans[j]='X' elif a[j]==0 and check[t][j]==1: ans[j]='x' line=f.readline().strip () #读取一行数据#关闭文件并输出ans列表检测结果,代码略。答案 (1)A (2)①int(line[0])或ord(line[0])-48②ord(line[j])-65或ord(line[j])-ord('A')③a[j]==1 and check[t][j]==0解析 (1)数字1需要BC灯亮起,因此D发生常亮故障,7需要ABC亮起,因此A段发生不亮故障,综上,检验结果为x00X000。(2)首先初始化ans数组为全'0',表示所有段在默认情况下都是正常的。然后遍历每一行数据,将a中该行数字对应的被点亮数码段状态更改为1。如果某段在日志中被点亮(即出现在某行数据中),但该数字不用亮起该段,将其在ans数组中标记为'X'(常亮)。如果某段在日志中从未被点亮,但在check数组中对应数字下应为点亮状态,则将其在ans数组中标记为'x'(不亮)。6.编排试场。每个试场有30个座位,试场号和座位号均从1开始编排。对n个班级的学生编排试场,要求连续分配座位的两个学生不属于同一个班级。分配方法:按班级人数降序排列,每次编排人数最多班级的学生,完成一名学生编排后,该班人数减少一个,将该班与班级人数次多班级互换,再从第2个班级开始降序排序,依此类推,直到完成最后一名学生考号编排。如有3个班,1班至3班的人数为36,35,35,第1试场座位号1的学生为1班学生,交换并排序后的班级依次为2,3,1,每班人数均为35人,座位号为2的学生是第1个班级(2班)。(1)若1班至4班的人数分别38,36,36,36,则第1试场座位号为5的班级是 。 (2)实现上述功能的部分Python程序如下,请在划线下填入合适的代码。#读取n个班级的人数并按降序排列,将每班的人数依次存储到num[0]至num[n-1]#降序排列后的班级名称依次存储到bj[0]至bj[n-1]中,如bj=[3,2,1,4,6,5,7],代码略。scbp=[] #存储试场编排信息zwh=sch=1 #试场号和座位号均从1开始编排while num[0]!=0: #生成一名学生准考证号s,格式为“入学年份(4位)+班号(2位)+班内序号(2位)” scbp.append([sch,zwh,s]) #完成一个学生的编排,格式为:试场号,座位号,准考证号 ① zwh+=1 if zwh==31: ② zwh=1 num[0],num[1]=num[1],num[0] bj[0],bj[1]=bj[1],bj[0] j=1 while ③ : num[j],num[j+1]=num[j+1],num[j] bj[j],bj[j+1]=bj[j+1],bj[j] j+=1#输出编排的试场信息,代码略。答案 (1)4 (2)①num[0]-=1 ②sch+=1③j解析 (1)座位1号分配后,人数为36,37,36,36;座位2号分配后,人数为37,36,36,35;座位3号分配后,人数为36,36,36(1班),35(2班),接着4班的学生。(2)①总是分配人数最多的班级bj[0],因此分配后该班人数num[0]将减少一个。②每个试场有30个座位,到了第31人,试场数将增加一个。③与后面的数进行比较,如果小于或等于后面的班级人数,进行交换。7.某地举办排球淘汰赛,参赛队伍从1号开始编号。每轮比赛,参赛队伍按编号从小到大依次安排比赛(如下表所示),胜者晋级,若末尾队伍无对手,则该队伍直接晋级。通常情况下,能力值高的队伍会战胜能力值低的队伍;如果能力值相近,则双方均有机会获胜。小明编写了一个Python程序,模拟比赛过程并预测冠亚军,若参赛队伍能力值相差不超过5,随机选择一个队伍获胜。例如有4支队伍,能力值与淘汰赛程如下表所示:第一轮 第二轮 最终结果1号队伍:97 1号队伍:97 1号队伍(冠军)2号队伍:863号队伍:65 4号队伍:73(亚军)4号队伍:73(1)在上述例子中增加2支队伍,5号队伍能力值为83,6号队伍能力值为76,则本次比赛的亚军为 号队伍。 (2)实现上述功能的代码如下,请在划线处填入合适的代码。import random#队伍编号与对应能力值存储在列表s,s=[["1号队伍",97],["2号队伍",86],……]while len(s)>1: nxt=[] #建立一个空列表nxt for i in range(① ): if abs(s[i][1]-s[i+1][1])<=5: win=random.choice([s[i],s[i+1]]) #随机选择一个获胜 elif ② : win=s[i] else: win=s[i+1] nxt.append(win) #将win 添加到列表nxt的末尾 if ③ : nxt.append(s[-1]) #将列表s 最末元素添加到nxt的末尾 s=nxtprint("冠军:",s[0][0])答案 (1)5 (2)①0,len(s)-1,2 ②s[i][1]>s[i+1][1] ③len(s) % 2==1解析 (1)5号队伍对6号队伍,5号队伍胜,5号队伍对4号队伍,5号队伍胜。(2)变量nxt存放每一轮比赛后获胜对的信息,当s中还有多支参赛队,则按“规则”进行一轮比赛,记录获胜队信息nxt。①按参赛队伍按编号从小到大依次安排比赛,每一局s[i]与s[i+1]比,每次2支队伍比赛。②当s[i]队伍比s[i+1]队伍的能力大5以上,由于前一个分支已经处理了相差5以内的队伍,因此此处,只需要表示i比i+1的能力值大。③从nxt.append(s[-1]),可知是将s中最后一支队伍直接加入nxt(即:轮空)结合题意,当队伍数量为奇数,则最后一支队伍轮空。8.给定一个公交路线的n个站点列表che(索引为0~n-1),其中che[i][0]表示第i站上车的人数,che[i][1]表示第i站下车的人数。公交车的最大载客量为max_c。现在需要找出该车从空车到坐满的起始站点和结束站点。示例:假设che=[[4,0],[0,4],[10,0],[5,2],[15,2],[8,4],[0,10],[0,8],[0,12]],最大载客量max_c=30。根据输入数据,车上人数从空车到坐满的区间为0~5和2~5。请回答下列问题:(1)假设che=[[10,0],[5,10],[10,3],[5,0],[15,2],[0,10],[0,8],[0,12]],车上人数从空车到坐满(max_c=30)的区间为 ~ (填数字)。 (2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。#读取一个公交路线的站点数据存入che 列表,读取max_c,代码略pos={0: [-1]}#定义初始字典① cnt=0;cur=0for i in range(n): cur+=che[i][0]-che[i][1] pre=② if pre in pos: for j in pos[pre]: print("站点:",j+1,"~",i) cnt+=1 if cur in pos: ③ else: pos[cur]=[i]print("从空车到坐满的区间共有:"+str(cnt)+"个")答案 (1)0 4 (2)①n=len(che)②cur-max_c ③pos[cur]+=[i]解析 (1)每站的人数为上一站人数加上本站上车人数减去本站下车人数。每站的人数依次为10,5,12,17,30。(2)①对公交车站点(che列表)的总数。②cur存储当前站i的总人数,从语句pos[cur]=[i]来看,字典pos表示达到cur人数的站台索引。当车上人数从0 增长到max_c时,需找到之前状态,即车上人数为cur-max_c时的站点。这个差值即可以找到可能的“起始站点”。③人数cur出现在字典pos中,将当前站点i添加到pos[cur]列表中,表明在前车上人数为cur的情况下,出现了一个新的站点。1.编写Python程序求生日幸运数。算法如下:遍历身份证号,提取其中最大连续非0数字(遇到0,当前连续结束;“X”作10处理)的和作为生日幸运数,如图中连续数字“21982”各位数字的和(2+1+9+8+2=22)最大,输出22作为生日幸运数。程序运行界面如图所示,请回答下列问题:请输入您的身份证号:330402198206061206 您的生日幸运数为:22(1)运行程序,输入身份证号33040220060102123X,则输出的生日幸运数为 。 (2)实现上述功能的Python程序如下,请在划线处填入合适的代码。s=input("请输入您的身份证号:")max=0;sum=0for i in s: if ① : if sum>max: max=sum ② else: if i=='x' or i=='X': sum+=10 else: ③ if sum>max: max=sumprint("您的生日幸运数为:",max)答案 (1)18 (2)①i=="0" 或 i<"1" 或 int(i)==0 ②sum=0 ③sum+=int(i)解析 (1)最大连续非0数字串是2123X,各个数字相加为2+1+2+3+10=18。(2)①如果当前字符是"0",则检查sum是否大于max,若是则更新max的值。②同时将sum重置为0。③如果当前字符不是"x"或"X",则将字符转换为整数并加到sum上。2.某商家举行抽奖活动。每位客户有一个7位号码,抽奖时,随机抽取1人,其他人中2位尾号相同的人获得相同奖次。若该等级实际获奖人数超额,则减少下一等级的预设名额。如一二等奖分别预设名额2人、3人,依次抽取一等奖尾号“12”1人,“45”3人,超过2人,则二等奖预设名额减少为3-2=1人,依此类推。实现算法的Python程序如下,回答下列问题:(1)若一至三等奖预设人数分别为3、4、5,已知一等奖依次是尾号“02”2人、尾号“15”3人,二等奖抽取的尾号依次是“03”1人、“48”3人,则三等奖实际获奖至少有 人。 (2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。程序运行后的部分运行界面如下图所示:尾号['03']获1等奖,共3人 尾号['25']获2等奖,共2人 尾号['72','77','12']获3等奖,共6人 尾号['82','94','08','99']获4等奖,共7人from random import randintnum=[2,3,5,8] #各等级预设获奖人数b=[];f=[False]*30;wh=[]#生成客户的7位号码,存在列表b,代码略j=total=0while j<=3: t=randint(0,len(b)-1) while f[t]: #抽取幸运观众 t=randint(0,len(b)-1) tem=b[t][5:] n=0 for i in range(len(b)): #尾号2位相同的其他人均获得相同奖励等级 if f[i]==False and tem==b[i][5:]: ① num[j]-=1 n+=1 total=② wh.append(tem) if num[j]<=0 and j<3: ③ #减少下一等级预设获奖人数 print(f"尾号{wh}获{j+1}等奖,共{total}人") j+=1;total=0;wh=[] elif num[j]<=0 and j==3: print(f"尾号{wh}获4等奖,共{total}人") break答案 (1)3 (2)①f[i]=True ②total+n ③num[j+1]+=num[j]解析 (1)一等奖设3人,实际获奖5人,超2人,二等奖应获奖人数为4-2=2人;二等奖实际获奖4人,超过2人,三等奖应获奖人数为5-2=3人。(2)①若第i个人的2位尾号与获奖者相同则也获奖,将flag[i]设置为True;②变量total累计某个奖次的所有获奖号码的个数。③本次奖次超出的人数,在下一等级奖次人数中减去。3.猜数游戏。游戏规则如下:设定一个秘密数,每猜错一次会得到格式为“iAjB”的提示,其中“iA”表示数字猜对且位置也猜对的数有i个,“jB”表示数字猜对但位置没猜对的数有j个。例如秘密数为“2507”时,若猜测数为“1702”,则提示是“1A2B”。(1)现已知秘密数为“37692”,猜测数为“79612”,则提示是 。 (2)上述功能的部分Python程序如下,请在划线处填入合适的代码。#将设定的秘密数存放于变量s中while True: g=input() if g==s: print("猜对了");break i=A=B=0 cnt1,cnt2=[0]*10,[0]*10 while i if ① : A+=1 else: cnt1[int(s[i])]+=1 ② i+=1 for j in range(10): m=min(cnt1[j],cnt2[j]) ③ print("提示:",str(A)+"A"+str(B)+"B")答案 (1)2A2B 或"2A2B" (2)①s[i]==g[i] ②cnt2[int(g[i])]+=1或cnt2[int(g[i])]=cnt2[int(g[i])]+1 ③B=B+m 或B+=m解析 (1)数字位置均正确的有2个,数字对位置错的有两个。(2)①检测数字s[i]和猜的数字位置g[i]是否正确,变量A为数字位置正确的个数。②cnt1用于统计s中相应数字出现的次数,cnt2用于统计猜数g中相应数字出现的次数。③数字位置均正确的没有统计在cnt1和cnt2中。若m=0,说明该数字或者没有出现过,或者只在g或s某一个出现过,此时应不计数;若m=1,说明这个数字在g和s中均出现了1次,但没有被统计到A中,即数字正确而位置不正确有1;若m=2,说明数字正确而位置不正确。4.某十字路口地面方向标志如图a所示,其红绿灯采用四相位(东西直行、东西左转、南北直行、南北左转)依次动态控制,如图b所示。每个相位的绿灯时长根据两个方向中较大的车辆数动态调整,调整范围为10~30秒。黄灯亮3秒后开始调整下一个相位。每辆车通过十字路口的平均时长为2秒。例如:东向西直行16辆,西向东直行2辆,计算绿灯时长为32秒,按调整范围要求将东西直行相位的绿灯时长调整为30秒。(1)若从0开始计时,东西直行相位最大车辆数为20,下一个相位(东西左转)最大车辆数为6,则南北直行相位的绿灯从第 秒开始。 (2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。def get_data(): #实时获取交通数据,将图b中的①~⑧方向的车辆数依次存储在列表中,如[11,3,5,4,12,22,13,11],代码略base=2;short=10;long=30cur=0while True: #依次判定四相位的绿灯时长 car=get_data() ① if car[cur+1]>t: t=car[cur+1] green=long if short<=t*base<=long: ② elif t*base green=short #调整该相位的绿灯时长并亮起,之后绿灯熄灭,黄灯亮起,代码略 cur=③ 答案 (1)48 (2)①t=car[cur] ②green=t*base ③(cur+2)%8解析 (1)东西直行相位最大车辆数20,需时长40秒,调整为最大值30秒;东西左转相位最大车辆数6,需12;黄灯时长均为3秒,总共时间为30+3+12+3=48秒。(2)①实时获取交通数据,将图b中的①~⑧方向的车辆数依次存储在列表car中,cur表示当前相位对应的第1个方向,变量t表示当前相位两个方向较多的车辆数,初值t为car[cur]。若该相位第2个方向车辆数car[cur+1]大于第1个方向中,更新t的值为最多方向的车辆数。②动态调整的绿灯有3种可能,当t*base大于30时,默认为上限30;若t*base在[10,30]范围内时,绿灯时长直接取t*base;若低于下限10,则绿灯时长取下限。③每个相位有2个方向(直行和左转),cur值的范围是0至7,每次cur需要加2并对8取模。5.某数据分析系统的功能为:采集实时数据val,生成最近连续5次数据的均值ave,如图a所示,绘制如图b所示的折线图,并发出数据异常信号:异常一,上穿异常,虚线(数据val)上穿实线(数据ave),如图b中时刻5→6;异常二,下穿异常,虚线(数据val)下穿实线(数据ave),如图b中时刻7→8。time val ave1 5.052 5.103 5.054 5.105 5.00 5.066 5.20 5.097 5.25 5.128 5.00 5.11图a请回答下列问题。(1)关于异常信号,下列说法正确的是 (单选,填字母)。 A.系统可能连续发出2个相同的异常信号B.系统不可能连续发出2个相同的异常信号(2)实现上述功能的部分Python代码如下,请在划线处填入合适的代码。data=[]while True: #接收实时数据val,代码略 data.append(val) if len(data)>=6: sum=0 for i in data[-6:]: sum=① pre_ave=(sum-data[-1])/5 #上一个近5次均值 ave=② #近5次均值 if data[-1]>ave: #发出异常一信号,代码略 #判断并发出异常二信号,代码略#绘制折线图,代码略(3)程序中加框处代码有错,请改正。答案 (1)B (2)①sum+i ②(sum-data[-6])/5或(sum-data[len(data)-6])/5(3)data[-1]>ave and data[-2]解析 (1)要产生上穿异常,本次val的值要大于本次ave值,而上次val值要小于上次ave的值。要产生下穿异常,则本次val的值要小于本次ave值,而上次val值要大于上次ave的值。因此,系统不可能连续发出2个相同的异常信号。(2)sum为6个数字之和,近5次均值应为sum减去最后1个数据的值之后求平均。(3)需要上一次的实线值小于上一次的平均值,即data[-2]ave。6.有n名同学参加春游,已知现有公用经费total元,同时每位同学又随身携带一些现金,用数组cash存储。春游地点有不同类型自行车若干辆供游客租用,每种类型的自行车按租金从高到低存储在数组info中。info[i]表示某类型自行车信息,包含租金和数量。其中,info[i][0]表示该类型自行车租金,info[i][1]表示该类型自行车数量。每位同学优先使用自己携带的现金租车,现金不够时可使用公用经费补足费用。为方便财务管理,规定每位同学只能为自己租用自行车,且不会相互借钱。请编写程序计算这n个同学是否能够全部租到自行车。(1)若人数n=5,total=80,cash=[21,15,10,8,5],info=[[60,1],[50,2],[35,2],[25,3]],判断这5个同学是否都能租到自行车 (单选,填字母:A.是/B.否)。 (2)完善程序,将①②处代码补充完整。(3)将加框处代码换成i==m,是否影响判断结果的准确性 (单选,填字母:A.影响/B.不影响)。 #total存储公用经费,info存储每种自行车的租金及库存,代码略#读取n个同学现金数量,存储在数组cash中,并将cash降序排序,代码略bike=[] #bike存储每辆自行车的租金n=len(cash)for i in range(len(info)): for j in range(info[i][1]): bike.append(info[i][0])m=len(bike)i=① j=0while i=0: if bike[i]>cash[j]: ② i+=1;j+=1if total>=0: print("能够满足全部同学租用自行车")else: print("资金不足,无法满足")答案 (1)B (2)①m-n②total-=bike[i]-cash[j] (3)B解析 (1)优先安排租便宜的自行车,一共5人,需要租3辆25元的和2辆35元的,共需要25*3+35*2=145元,但是公用经费和每位同学自己带的钱共80+21+15+10+8+5=139元,不足以租5辆自行车。(2)info存储每种自行车的租金及库存,两个for循环在bike数组中添加了总共可以租的车辆m和每个车的租金。租金从高到低排列,资金能满足租借最便宜的车子就可以了。①变量i从租金最少的第m-n车开始遍历,遍历到m-1,共有n个学生借到了自行车。②现金cash[j]不够时可使用公用经费total补足费用。(3)从m-n遍历m-1,共遍历了几个元素,若循环结束后,i的值为m,表示已经完成了n个学生的租借,因此条件是等效的。7.某路边有一排照明装饰灯,编号依次为1~n。现发现有多个装饰灯不亮,受维修成本的限制,只对其中的一部分进行维修,维修后保证有k个编号连续的装饰灯能够正常照明。编写程序,根据已损坏的装饰灯编号,输出最少需要维修的装饰灯数量。请回答下列问题:(1)若路边有10个照明装饰灯(编号1~10),其中编号为1、4、8、10的装饰灯不亮,维修后需保证有6个编号连续的装饰灯能正常照明,则最少需要维修的装饰灯数量是 。 (2)把划线处的代码补充完整。#输入照明装饰灯的总数n、编号连续的正常照明装饰灯数量k,代码略#读取不亮的装饰灯编号,存入d,代码略v=[0]*(n+1);c=[0]*(n+1)ans=nfor i in ① : v[d[i]]=1for i in range(1,n+1): c[i]=c[i-1]+v[i]i=1while i<=n-k+1: last=② num=c[last]-c[i-1] if ③ : ans=num i=i+1print(ans)答案 (1)1 (2)①range(len(d)) ②i+k-1 ③num解析 (1)修理编号为4的装饰灯,即可保证2到7号这6个装饰灯正常照明。(2)①语句v[d[i]]=1统计损坏装饰灯数量,损坏的装饰灯存入d中,需遍历d中所有数据。②数组c统计到当前位置共损坏灯的数量。i表示连续亮灯的开始位置,其最大值为n-k+1。last是连续亮灯的结束位置i+k-1③连续k个灯的区间内的损坏灯的数量为num,找出最小修理数量ans。8.景区有n个散客团队和m辆空观光车(编号均从1开始),每个散客团队不超10人,每辆车核载10人。现按顺序为团队安排观光车,分配规则如下:每个团队必须整体乘坐同一辆车,优先在已有人的车辆中选择可容纳且剩余座位数最少的车辆;若存在多辆车符合条件,则选择编号小的车辆;若不存在符合条件的车辆,则安排该团队乘坐新的空车,直到团队或车辆分配完毕。编写程序实现上述分配功能,并输出车辆所载的团队编号。请回答下列问题:(1)若散客团队人数列表s=[3,5,4,2,7,8,9],则4号团队乘坐 号车。 (2)实现模拟上述功能的部分Python程序如下,请在划线处填入合适的代码。#获取散客团队人数列表,存储在s中m,ed=5,0;bus=[10 for i in range(m)]① for i in range(n): best,minx=-1,11 for j in range(0,ed): if bus[j]>=s[i] and bus[j] minx,best=bus[j],j if best==-1: if ② : print("车辆已满");break else: best=ed;ed+=1 ③ #输出车辆编号和对应乘坐的散客团队编号答案 (1)1 (2)①n=len(s) ②ed>=m 或 ed==m 或 s[i]>max(bus) ③bus[best]-=s[i] 或 bus[best]=bus[best]-s[i]解析 (1)每一辆车不超过10人,优先在已有人的车辆中选择可容纳且剩余座位数最少的车辆;1号车坐团队1和2共8人,2号车坐团队3,团队4可以坐1号车。(2)①散客团队s的总数n。②从第0 辆遍历当前已分配的所有车辆ed-1,若当前已安排车辆数ed等于m,表示没有车辆可以再安排。③minx和best表示最少剩余座位数和辆索引,该车辆对应的剩余座位将减少s[i]个。9.新能源汽车电池在使用中会经历多次充放电,设计算法模拟电池充放电过程。列表a存储充放电数据,索引的偶数位-1表示放电,1表示充电,奇数位表示充放电量。如a=[-1,5,1,40],表示先放电5度,然后充电40度。一次操作充满电后多余数值不计,同理每次放电时剩余电量最多到0。根据上述算法,回答下列问题:(1)若电池最大容量10,初始满电。列表a=[-1,15,1,8,-1,10],则实际放电总量为 。 (2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。#生成列表a,共200个元素,偶数位是-1或1,奇数位是5~100的整数,代码略。cap=100;use=0 #电池初始满电 100 度,初始使用量0for i in range(① ): if ② or a[i]+cap==101: continue elif a[i]==-1: if cap>=a[i+1]: cap-=a[i+1];use+=a[i+1] else: cap=0;use+=cap else: #充电 if cap+a[i+1]>100: cap=100 else: ③ print("实际放电量",use,"度")答案 (1)18 (2)①0,len(a),2或0,200,2②a[i]+cap==-1或a[i]+cap<0③cap+=a[i+1]解析 (1)若电池最大容量10,初始满电。列表a=[-1,15,1,8,-1,10]的使用中,-1,15只能放电10,1,8充电8,-1,10时只有电量8可用,放电8,结果总放电18。(2)①程序中,每轮使用i和i+1两个位置,要全部遍历,得出答案。②此处是满电还要充电或者电池空还要放电两种无效情况的判断,a[i]+cap==101是满电还要充电,则填空处是电池剩余电量0(cap=0)还要放电(a[i]=-1)。③上面if的代码是充电限额,此处是正常充电a[i+1]的电量。10.某公路由于长期没有维修,路上出现了很多个坑。为了尽快填补好这些坑,交通管理部门决定对m处地段采取交通管制。将该公路看成一条直线,坑就是直线上的坐标点,坑所在的路段需要封控管制。例如某管制路段2~4,需封控2、3、4路段。交管部门为了减少管制路段的长度,希望将这n个坑分成m段(一段可以只有一个坑),使得这m段公路的总长度最小。请你根据n个坑的位置(位置已按照从小到大进行排序),计算管制路段最小的总长度。代码运行效果如图所示。路段数量:4 坑的坐标依次为:3,4,6,8,14,15,16,17,21,25,26,27,30,31,40,41,42,43 维修管制的路段依次为: 3~8 14~17 21~31 40~43 管制总长度为25请回答下列问题:(1)上图所示的例子中,若将路段数量修改为5,则管制路段总长度为 。 (2)实现上述功能的Python程序如下,请在划线处填入合适的代码。m=int(input("路段数量:"))s=input("坑的坐标依次为:").split(',')n=len(s)for i in range(n): s[i]=int(s[i])flag=[False]*(n-1)for i in range(1,m): k=-1 for j in range(n-1): if ① : if k==-1 or s[j+1]-s[j]>s[k+1]-s[k]: k=j flag[k]=Trueprint("维修管制的路段依次为:")dis,t=0,0for i in range(n-1): if flag[i]: print(s[t],"~",s[i]) dis+=s[i]-s[t]+1 ② print(s[t],"~",s[n-1])dis=③ print("管制总长度为",dis)答案 (1)22 (2)①not flag[j] ②t=i+1③dis+s[n-1]-s[t]+1解析 (1)若将4段分成5段,只需要其中一段中两个坑之间间隔最大的分割,在这里最大的为21~25,分割之后长度减少了3,故总长度为22。(2)根据程序的输出结果,可知变量dis为最后的总长度,最后一个循环中变量t为每一段起始位置的下标,i为末尾位置的下标,flag[i]表示s[i]与s[i+1]是否分割。故当输出每一段之后,dis加上每一段的举例,变量t要更新为i+1,故②处填写t=i+1。当结束循环,还有最后一段的长度未加上,最后一段为s[t]~s[n-1],则③处填写为dis+s[n-1]-s[t]+1。根据flag数组的含义,当flag[k]为True表示s[k]与s[k+1]已经分割,则下一次找分割位置时,必须为未分割的部分,故①处填写not flag[j]。11.老年机因其较大的按键,很适合老年人使用,但其中英文字母的输入方式比较麻烦,导致很多老年人不 太会用。如下图是一款老年机的键盘,其字母的输入方式如下:(1)若要输入英文字母“A”,则2键按1下;若要输入“B”,则2键按两下;其他英文字母的输入方式同理。(2)若连续输入的英文字母在同一数字键中,则在输入下一个英文字母前,需先按下1键以表示确定;若连续输入的英文字母不在同一数字键中,则不需要按1键,直接按所要输入英文字母对应的数字键即可。(3)若要输入空格,则按0键。王老师依据该手机的字母输入规则,设计了一个Python程序。实现输入按键被点击的顺序,显示手机中输入的英文内容的功能。程序运行界面如图所示:>>> 输入按键编号顺序:7999844666166 输出的内容是:PYTHON >>>实现该功能的程序代码如下:keyboard={ "0":"","2":"ABC","3":"DEF","4":"GHI","5":"JKL","6":"MNO","7":"PQRS","8":"TUV","9":"WXYZ"}yw=input("输入按键编号顺序:")① i=k=1result=""while i if yw[i]==key: k=k+1 else: if yw[i]=="1": ② result+=keyboard[key][k-1] key=yw[i] ③ i=i+1result+=keyboard[key][k-1]print("输出的内容是:",result)请回答下列问题:(1)若按键点击的顺序是“616661666166”,则手机中输入的英文是 。 (2)要实现程序的功能,请完善划线处的代码。答案 (1)MOON (2)①key=yw[0] ②i=i+1 ③k=1解析 (1)键6的第1个字母为M,同一数字键中,则在输入下一个英文字母前,需先按下1键,键6的第3个字母为O,第2个字母为N。(2)查找连续相同的键的个数。①变量i从1开始遍历,因此key的初值为yw[0]。若遍历到"1",说明是相同两个键的分隔符,i的位置加1。③若不相同,则这个键是下一组的第1个键。12.某电商仓库的商品补货规则如下:某商品当天销售后的库存量低于其安全库存量时,按该商品最大库存量的50%补货。如果所有商品库存量都高于其安全库存量,则库存量最少的商品补货30。若有多种商品库存量同为最少,则编号最大的商品补货。商品补货后库存量不能超过最大库存。请回答下列问题:(1)若某天5种商品数据如表所示,则需要补货的商品编号是 。 商品编号 0 1 2 3 4原始库存量 35 50 100 30 55当天销售量 19 5 20 10 5安全库存量 20 30 15 25 40最大库存量 150 120 100 200 130(2)实现模拟上述功能的部分Python程序如下,请在划线处填入合适的代码。#初始化每种商品原始库存量、安全库存量、最大库存量分别存储在列表p、q、r中,例如p[0]、q[0]、r[0]分别表示0号商品的原始库存量、安全库存量、最大库存量while True: for i in range(len(p)): #获取i号商品当天销售量存入变量s,代码略 ① flag=False k=0 for i in range(len(p)): if p[i] b=round(r[i]*0.5) if p[i]+b>r[i]: ② else: p[i]=p[i]+b flag=True if ③ : k=i if not flag: #对k号商品补货30,代码略 #延时1天,代码略答案 (1)0,3 (2)①p[i]=p[i]-s或p[i]-=s ②p[i]=r[i] ③p[i]<=p[k]解析 (1)商品0:35-19=16<20,补货;商品3:30-10=20<25,补货;其他商品均满足库存大于等于安全库存。(2)①p列表存储商品的原始库存量,获取i号商品当天销售量存入变量s,需更新该商品的库存量。②商品补货后库存量p[i]+b不能超过最大库存r[i]。③如果所有商品库存量都高于其安全库存量,则找出库存量最少的商品,若有多种商品库存量同为最少,则编号最大的商品补货。6.2 采用枚举算法处理已有数据学习目标 1.基于生活中的问题设计情境,掌握分析问题、抽象建模、设计算法、编写程序的过程。2.掌握利用算法解决问题的思维能力构建。(2023年6月浙江选考)某仓库有一排连续相邻的货位,编号依次为0~n-1,用于放置A、B两种类型的箱子,A型箱子占2个相邻货位,B型箱子占1个货位。编写程序,根据已完成的放置或搬离操作,输出空货位数及还可以放置A型箱子的最多数量(不移动已放置的箱子)。请回答下列问题:箱子类型 操作类型 货位编号B 放置 5A 放置 2,3B 放置 0A 放置 7,8A 搬离 2,3(1)若n为10,开始时货位全空,经过如题图所示的放置或搬离操作后,不移动已放置箱子的情况下,还可放置A型箱子的最多数量为 个。 (2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。#读取货位总数存入n,代码略。cnt1=nlst=[0]*n #货位状态,0表示对应的货位为空while True: #读取本次已描过数据:箱子类型、操作类型、货位编号起始值存入t,d和s,代码略 if t=="A": w=2 ① : w=1 else: #不是"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] i,cnt2=0,0 while i if lst[i]==0 and lst[i+1]==0: ③ cnt2+=1 i+=1 print("当前空货位数",cnt1,",还可放置A型箱子的最多数量:",cnt2) 抽象和建模是用程序实现算法前的重要步骤,抽象找出影响问题的主要因素,明确已知什么和求什么。建模是描述主要因素之间的关系,一是明确方法,往往采用遍历列表的方法;二是明确步骤,往往是求符合条件的和、个数、最值和平均值。枚举算法简称枚举法,也称为列举法、穷举法,是暴力策略的具体体现,又称为蛮力法,在遍历过程中求值与条件进行比对的过程。枚举法的基本思想是:逐一列举问题所涉及的所有情形,并根据问题提出的条件检验哪些是问题的解,哪些应予排除。例1 某公司有编号为0至n-1的n个会议室。每个预定的会议包含开始时间和结束时间,都会在未占用且编号较小的会议室举办,如果没有可用的会议室,会议将会延期到有空闲的会议室为止,并且优先提供给原开始时间最早的会议。编写python程序,求举办最多次会议室。请回答下列问题:(1)若会议室n为2,会议如图所示,编号为1(即第2个)会议室承办的会议次数为 。 会议序号 开始时间 结束时间会议1 0 30会议2 5 10会议3 15 20会议4 17 35(2)请完成下面划线处的代码。#读取会议室数量存存储到变量n。#读取会议到列表meetings中,每个元素包含会议开始时间和结束时间,并按开始时间排序,代码略。cnt=[0]*ntim=[0]*n #存储当前每个会议室承办会议的结束时间for m in meetings: best=0;i=0 while i if tim[i]<=m[0]: ① tim[i]=m[1] break if tim[i] i+=1 if i==n: cnt[best]+=1 ② ans=0for i in range(1,n): if ③ : ans=iprint("承办会议最多的会议室编号为:",ans)变式1 有n列砖组成的一面砖墙,每列砖由数量不等的砖块组成,每块砖的长宽高都为1。小明为了美化这面墙,需要在这面墙中找到一块面积最大的矩形用于涂鸦。如图a所示,有6列高度依次为2、1、5、6、2、3组成的砖墙,图b和图c是其中的两种方案。编写Python程序,找出面积最大的矩形,并输出其位置和面积。(1)结合图a,这面墙中可用于涂鸦的最大的矩形面积为 。 (2)实现上述功能的Python代码如下,请在划线处填上合适的代码。#数组num中依次存放各列砖墙的高度,代码略maxs=0;n=len(num)for i in range(n): minh=num[i] for j in ① : if minh>num[j]: minh=num[j] ② if s>maxs: ③ start=i+1 end=j+1print("起止砖列编号为:",start,end,",最大面积为:",maxs)例2 徐老师设计了一个德育考评系统,学生每天按时到校得1分,若能连续5天都按时到校,则连续按时到校的这几天共可获得1+2+3+4+5分,连续按时到校超过5天,第5天之后的每天得5分,迟到得0分,若学生平时表现良好,可以获得一次消除迟到记录的机会,如下图所示,某学生的到校数据为“YYNYYYNY”,其中“Y”表示按时到校,“N”表示迟到。徐老师设计相应的程序,找到消除迟到记录后总分最大的一种方案并进行修改,若有相同结果,则选择最早的一条记录进行修改。如图中消除前德育考评总分为10分,消除第3天迟到记录后,德育考评总分为21分。日期 第1天 第2天 第3天 第4天 第5天 第6天 第7天 第8天打卡状态 Y Y N Y Y Y N Y德育分数 +1 +2 +0 +1 +2 +3 +0 +1消除后打卡状态 Y Y Y Y Y Y N Y消除后德育分数 +1 +2 +3 +4 +5 +5 +0 +1(1)某位同学的到校记录为“NYYNYYNY”,则消除一次迟到记录后德育考评总分最大为 。 (2)实现上述功能的程序如下,请在划线处填入合适的代码。def cal(data): #根据学生到校记录data,计算出相应的德育考评总分,代码略data=input("输入有迟到记录的学生到校数据")score=cal(data)print("原德育成绩是",score)check=[0]for i in range(len(data)): if ① : check.append(i)check.append(len(data))t=0;maxt=0for i in range(1,len(check)-1): before=cal(data[check[i-1]:check[i+1]]) after=cal(data[check[i-1]:check[i]]+"Y"+data[check[i]:check[i+1]]) ② if temp>maxt: maxt=temp;t=iprint("消除的位置是第",check[t]+1,"天,德育考评总分是",③ ,"分") 变式2 某城市外环线公路限速80千米/小时,有若干个十字路口。现在有一辆车距离第1个路口1000米处匀速出发,且此时所有路口的红绿灯刚好从红灯跳到绿灯。编写程序,计算可以连续通过最多绿灯路口的最高车速。请回答下列问题:(1)若共有3个路口,每两个路口之间的距离均为1000米,车子通过路口的时间忽略不计,每个路口的红绿灯持续周期时间均为60秒,其中第0-30秒为绿灯,可以通行。车子以下列速度能连续通过3个路口的是 (单选,填字母)。 A.15米/秒(54千米/小时)B.20米/秒(72千米/小时)C.25米/秒(90千米/小时)(2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。#读取车子距离第1个路口距离以及每两个路口之间的距离存入dis列表中,代码略。#读取各路口红绿灯周期时间存入towtime列表中,代码略。ansx,ansy=0,0for speed in range(40,81): curtime,cout,imax=0,0,0 tspeed=int(speed*1000/3600) #速度转换为米/秒 for i in ① : curtime+=int(dis[i]/tspeed) tmp=curtime % towtime[i] if ② : cout+=1 if cout>imax: imax=cout else: ③ cout=0 if ④ : ansx=imax;ansy=speedprint("车速为"+str(ansy)+"千米/小时,可最多连续通过"+str(ansx)+"个路口")1.世界卫生组织认为成年人正常血压标准:收缩压在90-140之间并且舒张压在60-90之间(包含端点值)。现有监测到的连续若干天的血压值,编程计算正常血压持续的最长天数并输出起止日期,若有多段最长天数,则输出最后一段的起止日期。(1)某段时间测量的血压值如图所示,则正常血压持续的最长天数为 。 (2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。日期 收缩压 舒张压9月1日 130 939月2日 132 879月3日 133 859月4日 128 789月5日 152 919月6日 125 86#数组a中保存每天监测到的血压值,a[2*i]和a[2*i+1]分别表示第i 天的收缩压和舒张压,数组b保存日期数据,代码略;n=len(a)t,ans,end=0,0,0for i in range(n//2): if 90<=a[2*i]<=140 and 60<=a[2*i+1]<=90: t+=1 if ① : ans=t end=i else: ② print("正常血压持续的最长天数为:",ans)beg=③ print("起止日期:",b[beg],"--",b[end])2.某单位打印室有4台打印机(编号0~3),根据打印任务的紧急程度分为加急任务和普通任务,两种任务的分配规则如下:△任务甲为加急任务,优先分配: 先选择当前空闲的打印机(同空闲状态则编号小的优先) 若无空闲打印机,则选当前任务剩余时间最短的打印机(同剩余时间则编号小的优先)△任务乙为普通任务,按打印机累计打印份数分配,选择累计打印份数最少的打印机(同打印份数则打印机编号小的优先)(1)某时刻各打印机状态:打印机0:空闲(累计200份) 打印机1:忙碌,剩余8分钟(累计160份)打印机2:忙碌,剩余6分钟(累计160份) 打印机3:忙碌,剩余8分钟(累计200份)此时到达一个打印任务,下列选项中任务和分配的打印机相匹配的是 (单选,填字母)。 A.乙,打印机0 B.乙,打印机1C.甲,打印机2 D.甲,打印机3(2)以下python代码段实现打印任务的分配,请在划线处填入合适代码。(3)加框处代码有误,请改正。#[False,0,200]表示打印机状态(空闲),当前任务剩余时间,累计打印份数printer=[[True,6,200],[True,5,150],[True,8,150],[True,3,220]]#获取task值,如[True,20]表示任务属性(甲)与需打印份数,代码略def assignmen_task(printer,task): if task[0]: k=0 for i in range(len(printer)): if ① : #更新打印机状态与累计打印份数,代码略 return printer,i elif ② : k=i else: k=0 for i in range(1,len(printer)): if printer[k][2]>=printer[i][2]: k=i #更新打印机状态与累计打印份数,代码略 return printer,k3.某快递分拣站有4个分拣机器人(编号0~3),根据包裹重量分为优先包裹和普通包裹,两种包裹的分拣规则如下:①重量≥10kg的包裹为优先包裹,优先分配: 先选择当前空闲的机器人(同空闲状态则编号小优先) 若无空闲机器人,则选当前任务剩余时间最短的机器人(同剩余时间则编号小优先)②重量<10kg的包裹为普通包裹,按机器人累计分拣件数分配,选择累计分拣件数最少的机器人(同分拣件数则编号小优先)(1)某时刻状态:机器人0:空闲(累计200件);机器人1:忙碌,剩余8分钟(累计150件);机器人2:忙碌,剩余5分钟(累计150件);机器人3:忙碌,剩余8分钟(累计220件)。此时到达一个包裹,下列选项包裹重量和分配的机器人相匹配的是 (单选,填字母)。 A.3kg,机器人0B.5kg,机器人1C.10kg,机器人2D.15kg,机器人3(2)请完成划线处的代码。以下Python代码段实现优先包裹的分配:#[False,0,200]分别表示机器人状态(空闲),当前任务剩余时间,累计分拣件数robots=[[False,0,200],[True,5,150],[True,8,150],[True,3,220]]def assign_urgent(): for i in range(4): if ① : #更新机器人状态和累计分拣件数,代码略 return i #直接分配空闲机器人 k=0 for i in range(1,4): if ② : k=i ③ #更新累计分拣件数 return k4.小明为了研究生物实验室微生物培养皿中适宜的温度数据,通过从服务器数据库导出某培养皿中温度传感器采集到近24小时内全部的温度数据,查找当日温度连续不高于设定阈值(25 ℃)的最长时间段(若含有多段长度相同的最大值,输出最早的一个时间段)。(1)若采集到的时间点和温度数据用数组a 来表示,a[0][0]是第一个采集时间点,a[0][1]是第一个温度值,则[[1,21],[2,24],[3,25],[4,26],[5,22],[6,23]]中符合要求的最长时间段是 (单选,填字母:A.1至4/B.1至3/C.5至6)。 (2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。#获取采集到的温度数据,用数组a存放,代码略s=25;maxlen=0;n=len(a)start=end=0i=0while i if a[i][1]<=s: ① for j in range(i+l,n): if ② : break c=c+1 if c>maxlen: maxlen=c;start=i end=③ i=i+c else: i=i+1print("最长时间段为",a[start][0],"至",a[end][0])5.七段数码管常用于显示数字,如图a所示。给每段数码管编号,通过点亮不同的段显示不同的数字。例如,数字0需要点亮A,B,C,D,E,F段,数字1需要点亮B,C段。数码管经常发生故障:常亮和不亮。系统会根据运行日志判定数码管是否发生故障,如图b所示,日志由多行字符串组成,每行字符串中第一个字符为显示的数字,后为亮起的数码管编号。例如,“1BC”表示显示数字1时,B、C段亮起。日志中可能有同一个数字的多次记录,但不会自相矛盾。编写程序,用7个字符来标示数码管的检测结果。对于每一段,如果有证据表明它常亮,标记为“X”,若有证据表明它不亮,标记为“x”,若正常,标记为“0”。(1)某段日志如图b所示,则检验结果为 (单选,填字母)。 A.x00X000 B.x00x000C.X00x000 D.X00X000(2)实现上述功能的python程序如下,请在划线处填入合适的代码。check=[[1,1,1,1,1,1,0],[0,1,1,0,0,0,0],[1,1,0,1,0,1,1],[1,1,1,1,0,0,1],[0,1,1,0,1,0,1],[1,0,1,1,1,0,1],[1,0,1,1,1,1,1],[1,1,1,0,0,0,0],[1,1,1,1,1,1,1],[1,1,1,1,1,0,1]]#check标记每个数字应点亮的段ans=['0']*7f=open("log.txt");line=f.readline().strip()while line: t=① L=len(line);a=[0]*7 for j in range(1,L): a[ ② ]=1 for j in range(7): if ③ : ans[j]='X' elif a[j]==0 and check[t][j]==1: ans[j]='x' line=f.readline().strip () #读取一行数据#关闭文件并输出ans列表检测结果,代码略。6.编排试场。每个试场有30个座位,试场号和座位号均从1开始编排。对n个班级的学生编排试场,要求连续分配座位的两个学生不属于同一个班级。分配方法:按班级人数降序排列,每次编排人数最多班级的学生,完成一名学生编排后,该班人数减少一个,将该班与班级人数次多班级互换,再从第2个班级开始降序排序,依此类推,直到完成最后一名学生考号编排。如有3个班,1班至3班的人数为36,35,35,第1试场座位号1的学生为1班学生,交换并排序后的班级依次为2,3,1,每班人数均为35人,座位号为2的学生是第1个班级(2班)。(1)若1班至4班的人数分别38,36,36,36,则第1试场座位号为5的班级是 。 (2)实现上述功能的部分Python程序如下,请在划线下填入合适的代码。#读取n个班级的人数并按降序排列,将每班的人数依次存储到num[0]至num[n-1]#降序排列后的班级名称依次存储到bj[0]至bj[n-1]中,如bj=[3,2,1,4,6,5,7],代码略。scbp=[] #存储试场编排信息zwh=sch=1 #试场号和座位号均从1开始编排while num[0]!=0: #生成一名学生准考证号s,格式为“入学年份(4位)+班号(2位)+班内序号(2位)” scbp.append([sch,zwh,s]) #完成一个学生的编排,格式为:试场号,座位号,准考证号 ① zwh+=1 if zwh==31: ② zwh=1 num[0],num[1]=num[1],num[0] bj[0],bj[1]=bj[1],bj[0] j=1 while ③ : num[j],num[j+1]=num[j+1],num[j] bj[j],bj[j+1]=bj[j+1],bj[j] j+=1#输出编排的试场信息,代码略。7.某地举办排球淘汰赛,参赛队伍从1号开始编号。每轮比赛,参赛队伍按编号从小到大依次安排比赛(如下表所示),胜者晋级,若末尾队伍无对手,则该队伍直接晋级。通常情况下,能力值高的队伍会战胜能力值低的队伍;如果能力值相近,则双方均有机会获胜。小明编写了一个Python程序,模拟比赛过程并预测冠亚军,若参赛队伍能力值相差不超过5,随机选择一个队伍获胜。例如有4支队伍,能力值与淘汰赛程如下表所示:第一轮 第二轮 最终结果1号队伍:97 1号队伍:97 1号队伍(冠军)2号队伍:863号队伍:65 4号队伍:73(亚军)4号队伍:73(1)在上述例子中增加2支队伍,5号队伍能力值为83,6号队伍能力值为76,则本次比赛的亚军为 号队伍。 (2)实现上述功能的代码如下,请在划线处填入合适的代码。import random#队伍编号与对应能力值存储在列表s,s=[["1号队伍",97],["2号队伍",86],……]while len(s)>1: nxt=[] #建立一个空列表nxt for i in range(① ): if abs(s[i][1]-s[i+1][1])<=5: win=random.choice([s[i],s[i+1]]) #随机选择一个获胜 elif ② : win=s[i] else: win=s[i+1] nxt.append(win) #将win 添加到列表nxt的末尾 if ③ : nxt.append(s[-1]) #将列表s 最末元素添加到nxt的末尾 s=nxtprint("冠军:",s[0][0])8.给定一个公交路线的n个站点列表che(索引为0~n-1),其中che[i][0]表示第i站上车的人数,che[i][1]表示第i站下车的人数。公交车的最大载客量为max_c。现在需要找出该车从空车到坐满的起始站点和结束站点。示例:假设che=[[4,0],[0,4],[10,0],[5,2],[15,2],[8,4],[0,10],[0,8],[0,12]],最大载客量max_c=30。根据输入数据,车上人数从空车到坐满的区间为0~5和2~5。请回答下列问题:(1)假设che=[[10,0],[5,10],[10,3],[5,0],[15,2],[0,10],[0,8],[0,12]],车上人数从空车到坐满(max_c=30)的区间为 ~ (填数字)。 (2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。#读取一个公交路线的站点数据存入che 列表,读取max_c,代码略pos={0: [-1]}#定义初始字典① cnt=0;cur=0for i in range(n): cur+=che[i][0]-che[i][1] pre=② if pre in pos: for j in pos[pre]: print("站点:",j+1,"~",i) cnt+=1 if cur in pos: ③ else: pos[cur]=[i]print("从空车到坐满的区间共有:"+str(cnt)+"个")1.编写Python程序求生日幸运数。算法如下:遍历身份证号,提取其中最大连续非0数字(遇到0,当前连续结束;“X”作10处理)的和作为生日幸运数,如图中连续数字“21982”各位数字的和(2+1+9+8+2=22)最大,输出22作为生日幸运数。程序运行界面如图所示,请回答下列问题:请输入您的身份证号:330402198206061206 您的生日幸运数为:22(1)运行程序,输入身份证号33040220060102123X,则输出的生日幸运数为 。 (2)实现上述功能的Python程序如下,请在划线处填入合适的代码。s=input("请输入您的身份证号:")max=0;sum=0for i in s: if ① : if sum>max: max=sum ② else: if i=='x' or i=='X': sum+=10 else: ③ if sum>max: max=sumprint("您的生日幸运数为:",max)2.某商家举行抽奖活动。每位客户有一个7位号码,抽奖时,随机抽取1人,其他人中2位尾号相同的人获得相同奖次。若该等级实际获奖人数超额,则减少下一等级的预设名额。如一二等奖分别预设名额2人、3人,依次抽取一等奖尾号“12”1人,“45”3人,超过2人,则二等奖预设名额减少为3-2=1人,依此类推。实现算法的Python程序如下,回答下列问题:(1)若一至三等奖预设人数分别为3、4、5,已知一等奖依次是尾号“02”2人、尾号“15”3人,二等奖抽取的尾号依次是“03”1人、“48”3人,则三等奖实际获奖至少有 人。 (2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。程序运行后的部分运行界面如下图所示:尾号['03']获1等奖,共3人 尾号['25']获2等奖,共2人 尾号['72','77','12']获3等奖,共6人 尾号['82','94','08','99']获4等奖,共7人from random import randintnum=[2,3,5,8] #各等级预设获奖人数b=[];f=[False]*30;wh=[]#生成客户的7位号码,存在列表b,代码略j=total=0while j<=3: t=randint(0,len(b)-1) while f[t]: #抽取幸运观众 t=randint(0,len(b)-1) tem=b[t][5:] n=0 for i in range(len(b)): #尾号2位相同的其他人均获得相同奖励等级 if f[i]==False and tem==b[i][5:]: ① num[j]-=1 n+=1 total=② wh.append(tem) if num[j]<=0 and j<3: ③ #减少下一等级预设获奖人数 print(f"尾号{wh}获{j+1}等奖,共{total}人") j+=1;total=0;wh=[] elif num[j]<=0 and j==3: print(f"尾号{wh}获4等奖,共{total}人") break3.猜数游戏。游戏规则如下:设定一个秘密数,每猜错一次会得到格式为“iAjB”的提示,其中“iA”表示数字猜对且位置也猜对的数有i个,“jB”表示数字猜对但位置没猜对的数有j个。例如秘密数为“2507”时,若猜测数为“1702”,则提示是“1A2B”。(1)现已知秘密数为“37692”,猜测数为“79612”,则提示是 。 (2)上述功能的部分Python程序如下,请在划线处填入合适的代码。#将设定的秘密数存放于变量s中while True: g=input() if g==s: print("猜对了");break i=A=B=0 cnt1,cnt2=[0]*10,[0]*10 while i if ① : A+=1 else: cnt1[int(s[i])]+=1 ② i+=1 for j in range(10): m=min(cnt1[j],cnt2[j]) ③ print("提示:",str(A)+"A"+str(B)+"B")4.某十字路口地面方向标志如图a所示,其红绿灯采用四相位(东西直行、东西左转、南北直行、南北左转)依次动态控制,如图b所示。每个相位的绿灯时长根据两个方向中较大的车辆数动态调整,调整范围为10~30秒。黄灯亮3秒后开始调整下一个相位。每辆车通过十字路口的平均时长为2秒。例如:东向西直行16辆,西向东直行2辆,计算绿灯时长为32秒,按调整范围要求将东西直行相位的绿灯时长调整为30秒。(1)若从0开始计时,东西直行相位最大车辆数为20,下一个相位(东西左转)最大车辆数为6,则南北直行相位的绿灯从第 秒开始。 (2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。def get_data(): #实时获取交通数据,将图b中的①~⑧方向的车辆数依次存储在列表中,如[11,3,5,4,12,22,13,11],代码略base=2;short=10;long=30cur=0while True: #依次判定四相位的绿灯时长 car=get_data() ① if car[cur+1]>t: t=car[cur+1] green=long if short<=t*base<=long: ② elif t*base green=short #调整该相位的绿灯时长并亮起,之后绿灯熄灭,黄灯亮起,代码略 cur=③ 5.某数据分析系统的功能为:采集实时数据val,生成最近连续5次数据的均值ave,如图a所示,绘制如图b所示的折线图,并发出数据异常信号:异常一,上穿异常,虚线(数据val)上穿实线(数据ave),如图b中时刻5→6;异常二,下穿异常,虚线(数据val)下穿实线(数据ave),如图b中时刻7→8。time val ave1 5.052 5.103 5.054 5.105 5.00 5.066 5.20 5.097 5.25 5.128 5.00 5.11图a请回答下列问题。(1)关于异常信号,下列说法正确的是 (单选,填字母)。 A.系统可能连续发出2个相同的异常信号B.系统不可能连续发出2个相同的异常信号(2)实现上述功能的部分Python代码如下,请在划线处填入合适的代码。data=[]while True: #接收实时数据val,代码略 data.append(val) if len(data)>=6: sum=0 for i in data[-6:]: sum=① pre_ave=(sum-data[-1])/5 #上一个近5次均值 ave=② #近5次均值 if data[-1]>ave: #发出异常一信号,代码略 #判断并发出异常二信号,代码略#绘制折线图,代码略(3)程序中加框处代码有错,请改正。6.有n名同学参加春游,已知现有公用经费total元,同时每位同学又随身携带一些现金,用数组cash存储。春游地点有不同类型自行车若干辆供游客租用,每种类型的自行车按租金从高到低存储在数组info中。info[i]表示某类型自行车信息,包含租金和数量。其中,info[i][0]表示该类型自行车租金,info[i][1]表示该类型自行车数量。每位同学优先使用自己携带的现金租车,现金不够时可使用公用经费补足费用。为方便财务管理,规定每位同学只能为自己租用自行车,且不会相互借钱。请编写程序计算这n个同学是否能够全部租到自行车。(1)若人数n=5,total=80,cash=[21,15,10,8,5],info=[[60,1],[50,2],[35,2],[25,3]],判断这5个同学是否都能租到自行车 (单选,填字母:A.是/B.否)。 (2)完善程序,将①②处代码补充完整。(3)将加框处代码换成i==m,是否影响判断结果的准确性 (单选,填字母:A.影响/B.不影响)。 #total存储公用经费,info存储每种自行车的租金及库存,代码略#读取n个同学现金数量,存储在数组cash中,并将cash降序排序,代码略bike=[] #bike存储每辆自行车的租金n=len(cash)for i in range(len(info)): for j in range(info[i][1]): bike.append(info[i][0])m=len(bike)i=① j=0while i=0: if bike[i]>cash[j]: ② i+=1;j+=1if total>=0: print("能够满足全部同学租用自行车")else: print("资金不足,无法满足")7.某路边有一排照明装饰灯,编号依次为1~n。现发现有多个装饰灯不亮,受维修成本的限制,只对其中的一部分进行维修,维修后保证有k个编号连续的装饰灯能够正常照明。编写程序,根据已损坏的装饰灯编号,输出最少需要维修的装饰灯数量。请回答下列问题:(1)若路边有10个照明装饰灯(编号1~10),其中编号为1、4、8、10的装饰灯不亮,维修后需保证有6个编号连续的装饰灯能正常照明,则最少需要维修的装饰灯数量是 。 (2)把划线处的代码补充完整。#输入照明装饰灯的总数n、编号连续的正常照明装饰灯数量k,代码略#读取不亮的装饰灯编号,存入d,代码略v=[0]*(n+1);c=[0]*(n+1)ans=nfor i in ① : v[d[i]]=1for i in range(1,n+1): c[i]=c[i-1]+v[i]i=1while i<=n-k+1: last=② num=c[last]-c[i-1] if ③ : ans=num i=i+1print(ans)8.景区有n个散客团队和m辆空观光车(编号均从1开始),每个散客团队不超10人,每辆车核载10人。现按顺序为团队安排观光车,分配规则如下:每个团队必须整体乘坐同一辆车,优先在已有人的车辆中选择可容纳且剩余座位数最少的车辆;若存在多辆车符合条件,则选择编号小的车辆;若不存在符合条件的车辆,则安排该团队乘坐新的空车,直到团队或车辆分配完毕。编写程序实现上述分配功能,并输出车辆所载的团队编号。请回答下列问题:(1)若散客团队人数列表s=[3,5,4,2,7,8,9],则4号团队乘坐 号车。 (2)实现模拟上述功能的部分Python程序如下,请在划线处填入合适的代码。#获取散客团队人数列表,存储在s中m,ed=5,0;bus=[10 for i in range(m)]① for i in range(n): best,minx=-1,11 for j in range(0,ed): if bus[j]>=s[i] and bus[j] minx,best=bus[j],j if best==-1: if ② : print("车辆已满");break else: best=ed;ed+=1 ③ #输出车辆编号和对应乘坐的散客团队编号9.新能源汽车电池在使用中会经历多次充放电,设计算法模拟电池充放电过程。列表a存储充放电数据,索引的偶数位-1表示放电,1表示充电,奇数位表示充放电量。如a=[-1,5,1,40],表示先放电5度,然后充电40度。一次操作充满电后多余数值不计,同理每次放电时剩余电量最多到0。根据上述算法,回答下列问题:(1)若电池最大容量10,初始满电。列表a=[-1,15,1,8,-1,10],则实际放电总量为 。 (2)实现上述功能的部分Python程序如下,请在划线处填入合适的代码。#生成列表a,共200个元素,偶数位是-1或1,奇数位是5~100的整数,代码略。cap=100;use=0 #电池初始满电 100 度,初始使用量0for i in range(① ): if ② or a[i]+cap==101: continue elif a[i]==-1: if cap>=a[i+1]: cap-=a[i+1];use+=a[i+1] else: cap=0;use+=cap else: #充电 if cap+a[i+1]>100: cap=100 else: ③ print("实际放电量",use,"度")10.某公路由于长期没有维修,路上出现了很多个坑。为了尽快填补好这些坑,交通管理部门决定对m处地段采取交通管制。将该公路看成一条直线,坑就是直线上的坐标点,坑所在的路段需要封控管制。例如某管制路段2~4,需封控2、3、4路段。交管部门为了减少管制路段的长度,希望将这n个坑分成m段(一段可以只有一个坑),使得这m段公路的总长度最小。请你根据n个坑的位置(位置已按照从小到大进行排序),计算管制路段最小的总长度。代码运行效果如图所示。路段数量:4 坑的坐标依次为:3,4,6,8,14,15,16,17,21,25,26,27,30,31,40,41,42,43 维修管制的路段依次为: 3~8 14~17 21~31 40~43 管制总长度为25请回答下列问题:(1)上图所示的例子中,若将路段数量修改为5,则管制路段总长度为 。 (2)实现上述功能的Python程序如下,请在划线处填入合适的代码。m=int(input("路段数量:"))s=input("坑的坐标依次为:").split(',')n=len(s)for i in range(n): s[i]=int(s[i])flag=[False]*(n-1)for i in range(1,m): k=-1 for j in range(n-1): if ① : if k==-1 or s[j+1]-s[j]>s[k+1]-s[k]: k=j flag[k]=Trueprint("维修管制的路段依次为:")dis,t=0,0for i in range(n-1): if flag[i]: print(s[t],"~",s[i]) dis+=s[i]-s[t]+1 ② print(s[t],"~",s[n-1])dis=③ print("管制总长度为",dis)11.老年机因其较大的按键,很适合老年人使用,但其中英文字母的输入方式比较麻烦,导致很多老年人不 太会用。如下图是一款老年机的键盘,其字母的输入方式如下:(1)若要输入英文字母“A”,则2键按1下;若要输入“B”,则2键按两下;其他英文字母的输入方式同理。(2)若连续输入的英文字母在同一数字键中,则在输入下一个英文字母前,需先按下1键以表示确定;若连续输入的英文字母不在同一数字键中,则不需要按1键,直接按所要输入英文字母对应的数字键即可。(3)若要输入空格,则按0键。王老师依据该手机的字母输入规则,设计了一个Python程序。实现输入按键被点击的顺序,显示手机中输入的英文内容的功能。程序运行界面如图所示:>>> 输入按键编号顺序:7999844666166 输出的内容是:PYTHON >>>实现该功能的程序代码如下:keyboard={ "0":"","2":"ABC","3":"DEF","4":"GHI","5":"JKL","6":"MNO","7":"PQRS","8":"TUV","9":"WXYZ"}yw=input("输入按键编号顺序:")① i=k=1result=""while i if yw[i]==key: k=k+1 else: if yw[i]=="1": ② result+=keyboard[key][k-1] key=yw[i] ③ i=i+1result+=keyboard[key][k-1]print("输出的内容是:",result)请回答下列问题:(1)若按键点击的顺序是“616661666166”,则手机中输入的英文是 。 (2)要实现程序的功能,请完善划线处的代码。12.某电商仓库的商品补货规则如下:某商品当天销售后的库存量低于其安全库存量时,按该商品最大库存量的50%补货。如果所有商品库存量都高于其安全库存量,则库存量最少的商品补货30。若有多种商品库存量同为最少,则编号最大的商品补货。商品补货后库存量不能超过最大库存。请回答下列问题:(1)若某天5种商品数据如表所示,则需要补货的商品编号是 。 商品编号 0 1 2 3 4原始库存量 35 50 100 30 55当天销售量 19 5 20 10 5安全库存量 20 30 15 25 40最大库存量 150 120 100 200 130(2)实现模拟上述功能的部分Python程序如下,请在划线处填入合适的代码。#初始化每种商品原始库存量、安全库存量、最大库存量分别存储在列表p、q、r中,例如p[0]、q[0]、r[0]分别表示0号商品的原始库存量、安全库存量、最大库存量while True: for i in range(len(p)): #获取i号商品当天销售量存入变量s,代码略 ① flag=False k=0 for i in range(len(p)): if p[i] b=round(r[i]*0.5) if p[i]+b>r[i]: ② else: p[i]=p[i]+b flag=True if ③ : k=i if not flag: #对k号商品补货30,代码略 #延时1天,代码略 展开更多...... 收起↑ 资源列表 6.2 采用枚举算法处理已有数据.docx 6.2 采用枚举算法处理已有数据无答案.docx