浙江省绍兴市第一名校2023-2024学年高二上学期期中技术(选考)试题(解析版)

资源下载
  1. 二一教育资源

浙江省绍兴市第一名校2023-2024学年高二上学期期中技术(选考)试题(解析版)

资源简介

绍兴一中2023学年第一学期期中考试
高二技术试卷(选考)
第一部分 信息技术(共50分)
一、选择题(本大题共12小题,每小题2分,共24分。在每小题给出的四个选项中,只有一个符合题目要求,不选、多选、错选均不得分)
1. 下列关于数据和信息的说法,正确的是( )
A. 图形符号不是数据
B. 信息不会因为被别人获取而发生耗损
C. 信息具有载体依附性,不能脱离他反映的事物传播
D. 信息可用模拟信号来表达,模拟信号是离散、不连续的信号
2. 下列关于大数据的说法,不正确的是( )
A 处理大数据时,一般采用分治思想
B. 社交网络数据可采用图计算进行处理
C. 速度快是大数据的特征之一,仅指数据的产生速度快
D. 价值密度的高低与数据总量的大小成反比
3. 下列关于信息的编码,说法不正确的是( )
A. 8位二进制数能表示的最大的十进制数是255
B. n进制数120是n进制数12的n倍
C. 十进制数x刚好能整除8,则转换为二进制数后三位都为0
D. 十六进制数E0H中的“E”对应的权值是162
4. 相同像素大小的两幅图像,分别由黑白像素和256种颜色像素组成,其容量大小之比为( )
A. 1:8 B. 1:1 C. 1:128 D. 1:256
5. 某算法的部分流程图如下图所示,以下说法正确的是( )
A. 该流程执行后,变量s的值是42 B. 该流程执行后,变量a的值是16
C. 该流程用于计算并输出2-4+8-16的值 D. 该流程完整执行1次,“a<32 " 共执行了5次
6. 象限是平面直角坐标系(笛卡尔坐标系)中横轴和纵轴所划分的四个区域,每一个区域叫做一个象限。象限以原点为中心,x,y 轴为分界线,原点和坐标轴上的点不属于任何象限。某同学根据输入的坐标点(x,y)来判断该坐标点的位置所在,以下实现该分类的 Python 程序段中正确的是( )
A. B. C. D.
7. 有如下Python程序段:
n=int(input())
a=[0,0,0,0,0,0,0,0,0,0]
c=0
while n>0:
a[n%10]=a[n%10]+1
if a[n%10]==1:
c=c+1
n=n//10
print(c)
执行上述程序段,若输出c的值为4,则输入n的值可能为( )
A. 1123 B. 2373 C. 14551 D. 20045
8. 有如下Python程序段:
s=input()
s1=""
for i in s:
if "0" <= i <= "9":
s1=i+s1
else:
s1+=i
print(s1)
输入s值为“13Ka5iSh79”,执行该程序段后,输出结果是( )
A. 13Ka5iSh79 B. 13579KaiSh C. 97531KaiSh D. 31Ka5iSh97
9. 有如下Python程序段:
s="VictoryOnTheWay"#'A'的ASCII值为65,"a"的ASCII码值为97
mx=""
pre=0
for i in range(1len(s)):
if ord(s[i]) < 97:
if mxmx=s[pre:i]
pre=i
print(mx)
A. Victory B. On C. The D. Way
执行完以上程序段后,输出的内容为( )
10. 有如下Python 程序段:
lst=[74,32,66,46,38,28,85]
k=1
for i in range(len(lst)-1):
if lst[i]*k < lst[i+1]*k:
print(lst[i],end=" ")
k=-k
执行完以上程序段后,输出的内容为(  )
A. 74 66 38 B. 74 32 66 38 28 C. 74 32 66 46 38 28 D. 46
11. lst1和lst2都是升序排序的列表,执行如下Python程序段:
result=[]
i=0#用于遍历1st1
j=0#用于遍历1st2
while iif lst1[i]result.append(lst1[i])
i+=1
else:
result.append(lst2[j])
j+=1
while iresult.append(lst1[i])#②
i+=1
while jresult.append(lst2[j])#③
j+=1
下列说法不正确的是( )
A. 程序段①执行后,result可能与lst1相同 B. 程序段①执行后,result可能与lst2相同
C. 在一次程序运行中,②处代码和③处代码可能都被执行 D. 程序执行后,列表result中的元素升序排序
12. 有如下Python程序段:
from random import random
a=[1]*5
i=1
while i<=4:
a[i]=int(random()*10)+1
if a[i]==a[i-1]//2 or a[i]==a[i-1]*2:
i+=1
执行该程序段后,数组a的值可能是( )
A. [1,2,1,2,1] B. [1,2,4,8,16] C. [2,1,2,1,2,] D. [8,4,2,4,8]
二、非选择题(本大题共4小题,其中第13小题6分,第14小题6分,第15小题7分,第16小题7分,共26分)
13. 一个正整数,如果它能被7整除,或者它的十进制表示法中某一位上的数字为7,则称其为与7相关的数。现求所有小于等于n的与7无关的正整数的平方和。实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
n=int(input())
①____
for i in range(n+1):
flag=False
if i%7==0:
flag=True
m=i
while ②____:
if m%10==7:
flag=True
m//=10
if ③____:
sum=sum+i*i
print(sum)
14. 检查数学表达式中的括号是否配对是计算机进行数学计算的重要环节。括号序列“()()”中的“(”与“)”是配对的,而序列“())(”中的括号则是不配对的。对于不配对的序列,可以将“(”括号修改为“)”,或者将“)”修改为“(”来实现配对。如下图所示是括号序列“())(()”通过不同的方案所需要的修改次数,最少修改次数为2。
编写程序,计算修改括号序列使其配对的最少次数。部分Python程序如下,请在划线处填入合适的代码。
s=input() #输入括号序列,序列中仅包含“(”、“)”两种字符,且长度为偶数
x=0
ans=0
for i in range(len(s)):
if s[i]=="(":
①____
elif s[i]==")" and x>=1:
x-=1
elif s[i]==")" and ②____:
ans+=1
x+=1
ans+=③____
print(ans)
15. 某货品仓库最多存储m件货物,只能从左右两侧取出,现要在移动其他货物次数尽可能少的情况下取出一件某类货物,取出后,其他货物按照原有顺序重新存入,货物间不留空隙。比如:仓库存储情况列表a=["0","A","A","B","B","A","0","0","0","0","0"],其中“0”表示空位,“A”,“B”表示位置上货物种类,现需从中取出一件B货物,则应从右侧取出,取完后,仓库存储列表更新为a=["0","A","A","B","A","0","0","0","0"]。
(1)若要在上述实例中,再取出一件B货物,则应从____(选填:左侧/右侧)取出。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适代码
#读取仓库存储情况列表a,最多存储件数m,代码略
kind=input("请输入货物:")
left=right=0 #left记录从左侧取出此货物时需移动其他物品的次数,right记录从右侧取出此货物时需移动其他物品的次数
i=0;j=m-l
t=[0,0] #t表示是否找到此货物
while i<=j and t!=[11]
if____:
i=i+1
elif a[i]!=kind:
left+=1
i=i+l
else:
t[0]=1
if a[j]== "0":
j=j-1
elif a[j]!=kind:
____
j=j-1
else:
t[1]=1
if left>right:
for k in range(j,m-l):
a[k]=a[k+1]
a[m-1]= "0"
else:
for k in range(____):
a[k]=a[k-1]
a[0]= "0"
print(a)
16. 某公路由于长期没有维修,路上出现了很多个坑。为了尽快填补好这些坑,交通管理部门决定对m处地段采取交通管制。将该公路看成一条直线,坑就是直线上的坐标点,坑所在的路段需要封控管制。例如某管制路段2~4,需封控2、3、4路段。交管部门为了减少管制路段的长度,希望将这n个坑分成m段(一段可以只有一个坑),使得这m段公路的总长度最小。请你根据n个坑的位置(位置已按照从小到大进行排序),计算管制路段最小的总长度。代码运行效果如下图所示。
请回答下列问题:
(1)上图所示的例子中,若将路段数量修改为5,则管制路段总长度为____
(2)实现上述功能的Python程序如下,请在划线处填入合适的代码。
m=int(input("路段数量: "))
s=input("坑坐标依次为:").split(',') #实现字符串“3,4,6”,转化为列表[“3”,”4”,”6”]
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]=True
print("维修管制的路段依次为:")
dis,t=0,0
for 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)绍兴一中2023学年第一学期期中考试
高二技术试卷(选考)
第一部分 信息技术(共50分)
一、选择题(本大题共12小题,每小题2分,共24分。在每小题给出的四个选项中,只有一个符合题目要求,不选、多选、错选均不得分)
1. 下列关于数据和信息说法,正确的是( )
A. 图形符号不是数据
B. 信息不会因为被别人获取而发生耗损
C. 信息具有载体依附性,不能脱离他反映的事物传播
D. 信息可用模拟信号来表达,模拟信号是离散、不连续的信号
【答案】B
【解析】
【详解】本题考查数据、信息相关内容。数据是信息的表现形式和载体,可以是符号、文字、数字、语音、图像、视频等,A选项错误;信息可被多次重复使用,不会损耗和消失,B选项正确;信息可以脱离它所反映的事物被存储和传播,C选项错误;信息可用模拟信号来表达,但模拟信号是连续的信号,D选项错误。故本题答案是B选项。
2. 下列关于大数据的说法,不正确的是( )
A. 处理大数据时,一般采用分治思想
B. 社交网络数据可采用图计算进行处理
C. 速度快是大数据的特征之一,仅指数据的产生速度快
D. 价值密度的高低与数据总量的大小成反比
【答案】C
【解析】
【详解】本题考查大数据相关内容。大数据的数据体量大,在处理时需采用分治思想,选项A正确;对社交网络、网购行为等数据一般采用图计算方式进行处理,选项B正确;大数据的速度快不仅仅指处理速度快,还体现在产生速度快,选项C错误;大数据的价值密度的高低与数据总量的大小成反比,选项D正确;故本题答案是C选项。
3. 下列关于信息的编码,说法不正确的是( )
A. 8位二进制数能表示最大的十进制数是255
B. n进制数120是n进制数12的n倍
C. 十进制数x刚好能整除8,则转换为二进制数后三位都为0
D. 十六进制数E0H中的“E”对应的权值是162
【答案】D
【解析】
【详解】本题考查数制相关内容。A选项,8位二进制数能表示的十进制数是0-255,选项正确;B选项,n进制数120是n进制数12的n倍,比如十进制数120是十进制数12的10倍,选项正确;C选项,十进制数x刚好能整除8,8转换成二进制位:1000,能被8整除的十进制数转换成二进制后同样也能被二进制8整除,则该十进制数转换为二进制后,其后三位均为0,选项正确;D选项,“E”对应的权值为161,选项错误。故本题答案是D选项。
4. 相同像素大小的两幅图像,分别由黑白像素和256种颜色像素组成,其容量大小之比为( )
A. 1:8 B. 1:1 C. 1:128 D. 1:256
【答案】A
【解析】
【详解】本题主要考查图像文件容量。图像文件容量(字节)=像素*颜色深度/8,黑白像素图颜色深度是1位(21=2),256种颜色像素图颜色深度是8位(28=256),因此相同像素大小的两幅图像,分别由黑白像素和256种颜色像素组成,其容量大小之比为1:8,故本题选A选项。
5. 某算法的部分流程图如下图所示,以下说法正确的是( )
A. 该流程执行后,变量s的值是42 B. 该流程执行后,变量a的值是16
C. 该流程用于计算并输出2-4+8-16的值 D. 该流程完整执行1次,“a<32 " 共执行了5次
【答案】D
【解析】
【详解】本题考查算法流程图相关内容。s=0,k=1,a=2,第一次循环,a<32成立(a<32执行1次),执行s=s+k*a=2,k=1-k=0,a=2*a=4;第二次循环,满足a<32(a<32执行2次),执行s=s+k*a=2,k=1-k=1,a=2*a=8;第三次循环,满足a<32(a<32执行3次),执行s=s+k*a=10,k=1-k=0,a=2*a=16;第四次循环,满足a<32(a<32执行4次),执行s=s+k*a=10,k=1-k=1,a=2*a=32;不满足a<32(a<32执行5次),循环结束。该流程执行后,变量k的值是1,变量a的值是32,变量s的值是10,该流程完整执行1次,“a<32?”共执行了5次.故本题答案是D选项
6. 象限是平面直角坐标系(笛卡尔坐标系)中横轴和纵轴所划分的四个区域,每一个区域叫做一个象限。象限以原点为中心,x,y 轴为分界线,原点和坐标轴上的点不属于任何象限。某同学根据输入的坐标点(x,y)来判断该坐标点的位置所在,以下实现该分类的 Python 程序段中正确的是( )
A. B. C. D.
【答案】D
【解析】
【详解】本题考查Python选择结构相关知识。A选项,当x=0,y=0时出现“原点”、“数轴”两个结果,错误;B选项,if x==0 or y==0 与elif x==0 and y==0 相矛盾,错误;C选项,当x=0,y=0时出现“原点”、“数轴”两个结果,错误;故本题答案为D选项。
7. 有如下Python程序段:
n=int(input())
a=[0,0,0,0,0,0,0,0,0,0]
c=0
while n>0:
a[n%10]=a[n%10]+1
if a[n%10]==1:
c=c+1
n=n//10
print(c)
执行上述程序段,若输出c值为4,则输入n的值可能为( )
A 1123 B. 2373 C. 14551 D. 20045
【答案】D
【解析】
【详解】本题考查Python程序设计相关内容。输入D选项,n=20045,n>0成立,进入循环:20045%10=5,a[5]=a[5]+1=0+1=1,a[5]==1成立,c=c+1=0+1=1,n=n//10=20045//10=2004;n>0成立,进入循环:2004%10=4,a[4]=a[4]+1=0+1=1,a[4]==1成立,c=c+1=1+1=2,n=n//10=2004//10=200;n>0成立,进入循环:200%10=0,a[0]=a[0]+1=0+1=1,a[0]==1成立,c=c+1=2+1=3,n=n//10=200//10=20;n>0成立,进入循环:20%10=0,a[0]=a[0]+1=1+1=2,a[0]==1不成立,n=n//10=20//10=2;n>0成立,进入循环:2%10=2,a[2]=a[2]+1=0+1=1,a[2]==1成立,c=c+1=3+1=4,n=n//10=2//10=0;n>0不成立,不再进入循环。此时,c=4,符合题目要求。输入ABC选项,C的值均为3,不符合题意。故本题答案是D选项。
8. 有如下Python程序段:
s=input()
s1=""
for i in s:
if "0" <= i <= "9":
s1=i+s1
else:
s1+=i
print(s1)
输入s值为“13Ka5iSh79”,执行该程序段后,输出的结果是( )
A. 13Ka5iSh79 B. 13579KaiSh C. 97531KaiSh D. 31Ka5iSh97
【答案】C
【解析】
【详解】本题主要考查Python程序的执行。分析程序可知,变量i依次取字符串s中的字符,如果i是数字,则逆着拼接到s1中;如果i是字母,则正序拼接到s1中,故输入s值为“13Ka5iSh79”,执行该程序段后,输出的结果是97531KaiSh,故本题选C选项。
9. 有如下Python程序段:
s="VictoryOnTheWay"#'A'的ASCII值为65,"a"的ASCII码值为97
mx=""
pre=0
for i in range(1,len(s)):
if ord(s[i]) < 97:
if mxmx=s[pre:i]
pre=i
print(mx)
A. Victory B. On C. The D. Way
【答案】A
【解析】
【详解】本题考查的是Python应用。阅读程序可知,从字符串s的i字母开始,如果是大写字母,并且mx"Victory",不执行mx=s[pre:i],故最后输出:Victory。选项A正确。
执行完以上程序段后,输出的内容为( )
10. 有如下Python 程序段:
lst=[74,32,66,46,38,28,85]
k=1
for i in range(len(lst)-1):
if lst[i]*k < lst[i+1]*k:
print(lst[i],end=" ")
k=-k
执行完以上程序段后,输出的内容为(  )
A. 74 66 38 B. 74 32 66 38 28 C. 74 32 66 46 38 28 D. 46
【答案】D
【解析】
【详解】本题主要考查Python程序的执行。分析程序可知,每次循环k都变号,如果满足lst[i]*k < lst[i+1]*k,则输出lst[i]否则跳过。74>32,-32>-66,66>46,-46<-38,38>28,-28>-85,故满足if判断的只有-46<-38,故输出的内容为46,故本题选D选项。
11. lst1和lst2都是升序排序的列表,执行如下Python程序段:
result=[]
i=0#用于遍历1st1
j=0#用于遍历1st2
while iif lst1[i]result.append(lst1[i])
i+=1
else:
result.append(lst2[j])
j+=1
while iresult.append(lst1[i])#②
i+=1
while jresult.append(lst2[j])#③
j+=1
下列说法不正确的是( )
A. 程序段①执行后,result可能与lst1相同 B. 程序段①执行后,result可能与lst2相同
C. 在一次程序运行中,②处代码和③处代码可能都被执行 D. 程序执行后,列表result中的元素升序排序
【答案】C
【解析】
【详解】本题考查Python程序设计相关内容。分析题意可知,该代码段是连接两个升序列表lst1和lst2,使之成为一个新的升序列表result,D选项正确;有可能lst1中元素都比lst2中元素小,则执行完①后,result与lst1相同,A选项正确;同样道理,执行完①后,result与lst2也可能相同,B选项正确;选项C结论与lst1和lst2各自长度相关,两者有可能长度相等,此时执行完①后不再执行②③,有可能一长一短,要么执行②,要么执行③,该选项错误;故本题答案是C选项。
12. 有如下Python程序段:
from random import random
a=[1]*5
i=1
while i<=4:
a[i]=int(random()*10)+1
if a[i]==a[i-1]//2 or a[i]==a[i-1]*2:
i+=1
执行该程序段后,数组a的值可能是( )
A. [1,2,1,2,1] B. [1,2,4,8,16] C. [2,1,2,1,2,] D. [8,4,2,4,8]
【答案】A
【解析】
【详解】本题考查Python程序设计相关内容。 a[0]=1;a[i]=int(random.random()*10+1),a[i]随机生成1~10之间的整数,可以排除B选项;由i=1及if a[i]==a[i-1]//2 or a[i]==a[i-1]*2:i+=1;可知,从a[1]开始,每一项是前一项的2倍或1/2,由于a[0]=1,则a[1]肯定为2,排除CD选项。故本题答案是A选项。
二、非选择题(本大题共4小题,其中第13小题6分,第14小题6分,第15小题7分,第16小题7分,共26分)
13. 一个正整数,如果它能被7整除,或者它的十进制表示法中某一位上的数字为7,则称其为与7相关的数。现求所有小于等于n的与7无关的正整数的平方和。实现上述功能的部分Python程序如下,请在划线处填入合适的代码。
n=int(input())
①____
for i in range(n+1):
flag=False
if i%7==0:
flag=True
m=i
while ②____:
if m%10==7:
flag=True
m//=10
if ③____:
sum=sum+i*i
print(sum)
【答案】 ①. sum=0 ②. m>0 或 m!=0 ③. flag==False
【解析】
【详解】本题考查Python程序设计相关内容。分析题意及代码段可知,sum作用是计算平方和,其初值应为0,故①处应填写:sum=0;②处,m=i,m获得i的值,当m(即i)的值为正整数时才可以去讨论其与7的关系,故此处应填写:m>0 或 m!=0;③处,由if m%10==7:flag=True,得出m与7有关时,flag=True,则当m与7无关(即flag==False)时,才可以计算平方和,故此处应填写:flag==False。
【分析】
【点睛】
14. 检查数学表达式中的括号是否配对是计算机进行数学计算的重要环节。括号序列“()()”中的“(”与“)”是配对的,而序列“())(”中的括号则是不配对的。对于不配对的序列,可以将“(”括号修改为“)”,或者将“)”修改为“(”来实现配对。如下图所示是括号序列“())(()”通过不同的方案所需要的修改次数,最少修改次数为2。
编写程序,计算修改括号序列使其配对的最少次数。部分Python程序如下,请在划线处填入合适的代码。
s=input() #输入括号序列,序列中仅包含“(”、“)”两种字符,且长度为偶数
x=0
ans=0
for i in range(len(s)):
if s[i]=="(":
①____
elif s[i]==")" and x>=1:
x-=1
elif s[i]==")" and ②____:
ans+=1
x+=1
ans+=③____
print(ans)
【答案】 ①. x=x+1或x+=1 ②. x==0 ③. x//2
【解析】
【详解】本题考查表达式括号匹配相关操作。分析代码段,可知:①处,s存放括号序列,当s[i]=='('时,新括号对即将产生,可能需要修改的括号对数量x增1,故此处应填写:x+=1(或x=x+1);②处,由下面代码ans+=1,且x+=1,当s[i]==')',说明此处前已匹配完,s[i]处需要修改,因此判断条件除了当s[i]==')'外,x也为0,故此处应填写:x==0;③处,ans统计最终需要修改的次数,由于出现不匹配时,要么将“(”修改为“)”,要么将“)”修改为“(”,有两种修改可能,我们只需要选择一种修改方式即可,故此处应填写:x//2。
15. 某货品仓库最多存储m件货物,只能从左右两侧取出,现要在移动其他货物次数尽可能少的情况下取出一件某类货物,取出后,其他货物按照原有顺序重新存入,货物间不留空隙。比如:仓库存储情况列表a=["0","A","A","B","B","A","0","0","0","0","0"],其中“0”表示空位,“A”,“B”表示位置上货物种类,现需从中取出一件B货物,则应从右侧取出,取完后,仓库存储列表更新为a=["0","A","A","B","A","0","0","0","0"]。
(1)若要在上述实例中,再取出一件B货物,则应从____(选填:左侧/右侧)取出。
(2)实现上述功能的部分Python程序如下,请在划线处填入合适代码
#读取仓库存储情况列表a,最多存储件数m,代码略
kind=input("请输入货物:")
left=right=0 #left记录从左侧取出此货物时需移动其他物品的次数,right记录从右侧取出此货物时需移动其他物品的次数
i=0;j=m-l
t=[0,0] #t表示是否找到此货物
while i<=j and t!=[1,1]
if____:
i=i+1
elif a[i]!=kind:
left+=1
i=i+l
else:
t[0]=1
if a[j]== "0":
j=j-1
elif a[j]!=kind:
____
j=j-1
else:
t[1]=1
if left>right:
for k in range(j,m-l):
a[k]=a[k+1]
a[m-1]= "0"
else:
for k in range(____):
a[k]=a[k-1]
a[0]= "0"
print(a)
【答案】 ①. 右侧
②. a[i]==0 ③. right+=1或right=right+1 ④. i,0,-1
【解析】
【详解】本题考查Python程序设计相关内容。分析题意可知:只能从左右两侧取出,取出后,其他货物按照原有顺序重新存入,货物间不留空隙。①处,再取出一件B货物,则应从右侧取出。原因:右侧是B货物的最近存放位置,取出后需要移动货物次数最少。故此处应填写:右侧。分析给定代码段,可知:left记录离左外侧最近的此货物的离外侧距离,从左遍历时,若当前a[i]为“0”,则继续下一个,不增加left值;若当前a[i]为此货物,则左侧遍历结束;若当前a[i]是其他货物,则left+1并继续下一个;右侧同理。最后判断left和right大小,小的那侧内移。②处,用于检查仓库的第i个位置是否为空位。在仓库存储情况列表a中,“0”表示空位,因此条件检查了当前位置是否为空。故此处应填写:a[i]=="0"。③处,表示从右侧取出此货物时,需移动其他物品的次数增加1。在这个循环中,右侧的货物被往左移动,所以右侧取出货物需要移动右边的货物,因此right记录了离右外侧最近的此货物的离外侧距离。故此处应填写:right+=1。④处,表示在左侧取出货物时,将左边的货物往右移动一位,以保持仓库中没有空隙。具体来说,a[k]的值被设置为a[k-1],这表示当前位置的货物被前一个位置的货物替代,实现了左侧取出货物并移动其他货物的目标,所以k的位置应从右侧往左侧变化,故此处应填写:i,0,-1。
16. 某公路由于长期没有维修,路上出现了很多个坑。为了尽快填补好这些坑,交通管理部门决定对m处地段采取交通管制。将该公路看成一条直线,坑就是直线上的坐标点,坑所在的路段需要封控管制。例如某管制路段2~4,需封控2、3、4路段。交管部门为了减少管制路段的长度,希望将这n个坑分成m段(一段可以只有一个坑),使得这m段公路的总长度最小。请你根据n个坑的位置(位置已按照从小到大进行排序),计算管制路段最小的总长度。代码运行效果如下图所示。
请回答下列问题:
(1)上图所示的例子中,若将路段数量修改为5,则管制路段总长度为____
(2)实现上述功能的Python程序如下,请在划线处填入合适的代码。
m=int(input("路段数量: "))
s=input("坑的坐标依次为:").split(',') #实现字符串“3,4,6”,转化为列表[“3”,”4”,”6”]
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]=True
print("维修管制的路段依次为:")
dis,t=0,0
for 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)
【答案】 ①. 22 ②. flag[j]==False或not flag[j] ③. t=i+1 ④. dis+s[n-1]-s[t]+1
【解析】
【详解】本题考查Python程序设计相关内容。
(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]或flag[j]==False。

展开更多......

收起↑

资源列表