没有合适的资源?快使用搜索试试~ 我知道了~
信息技术:选考算法大题 - 答案.pdf
需积分: 0 0 下载量 170 浏览量
2023-07-29
21:00:44
上传
评论
收藏 1.89MB PDF 举报
温馨提示
试读
33页
信息技术:选考算法大题 - 答案.pdf
资源推荐
资源详情
资源评论
姓名:_________________学号:_______________班级:____________2022 年 5-12 月选考算法大题
1 / 20
2022 年 5-12 月选考算法大题
2022 年 11 月台州一模
14.为了让全班同学参加文艺汇演,小王设计了一个节目:先让 k 个同学同时出现在舞台上开始表演,
当某 1 个同学率先完成他的表演部分,马上离开舞台,第 k+1 个同学会立即出现在舞台上并开始表
演;当第 2 个同学离开舞台时,第 k+2 个同学也随即出现在舞台……
以此类推,直到所有同学上台,当最后一个同学完成他舞台上的表演,节目结束。
由于表演时长有限,小王希望在表演限定时长 tmax 内,确定最少在舞台上同时表演的同学数量 k。
他根据上述要求编写 Python 程序,读取 n 个同学的表演时长(秒),通过不断增加同时表演的人数 k,
找到第一个表演时长小于等于 tmax 的 k 值并输出。
(1)若有 6 位同学参加表演,他们的表演顺序及时长(秒)分别是“20、40、15、25、10、30”,同
时在舞台表演的人数为 3,则全部同学完成表演所需的时长为______60____秒。
(2)在计算表演时长的过程,为了快速获取舞台上最先完成表演的时间,小王采用 Python 中现成的
优先队列类 PriorityQueue,该类常用的方法如第 14 题图所示。
类及方法 说明 样例
PriorityQueue 声明一个优先队列,默认最小值优先 que=PriorityQueue()
put() 向优先队列中加入元素 que.put(50)
get() 返回队列中的最值元素(默认为最小值),
并移除该元素
que.get()
from queue import PriorityQueue #引入优先队列类库
def compute(x,n):
q=PriorityQueue()
for i in range(x): #将前x个表演同学的时长加入 q 队列中
q.put(d[i])
c=0 #c变量用于存储上一位同学离开舞台的结束时间
i=x
_____①___t=0__
while i<n:
y=q.get() #获取队列中的最小值,并弹出队列
t+=y-c #累加该同学比上一个同学多用的表演时间
t 表示最后的时间,
t=现在的同学-上一个同学,全部累加
例如 20,40,15 t+=15-0 15 出局
20,40,(15+25) t+=20-15 20 出局
(20+10),40,(15+25) t+=30-20 30 出局
(20+10+30),40,(15+25) t+=40-30 40 出局
(20+10+30),40,(15+25) t+=40-40 40 出局
(20+10+30),40,(15+25) t+=60-40 60 出局,最终 t=60
c=y
q.put(_____②__d[i]+c___) d[i]加载在上一次的最小值上
i+=1
#将舞台上剩余同学多用的表演时间累加到变量 t 中,代码略
姓名:_________________学号:_______________班级:____________2022 年 5-12 月选考算法大题
2 / 20
return t
#读取全班 n 个同学的表演时长,按表演顺序依次存在数组 d[0]~d[n-1]中,代码略
tmax =int(input("请输入限定表演时长(秒): "))
k=1
while k<=n:
if _____③__compute(k,n)<=tmax___:
break
else:
k+=1
if k>n:
print("不存在在限定时间内完成表演的方案! ")
else:
print("需要同时表演的最少同学数量为:",k)
15.利用某火车购票系统购票,购买者输入“出发站”、“目的站”,系统会统计两站之间的占座情况,
根据空座数量(出发站至目的站之前一直是空的座位即为空座)返回余票情况,购买者根据余票信息
购买车票,获得具体座位号。
根据上述功能,小王编写了一个 Python 程序模拟该购票系统,以“杭台高铁”为例,全线共设 9
个车站,某趟列车共有 8 节车厢,每节车厢共有 17 排,每排 5 个座位(编号分别是 A、B、C、D、
F),共 680 个座位,某时刻的占座情况如第 15 题图所示。具体设计如下:从数据库中读取占座情况
存储在列表 seat 中(例如:序号为 84 座位各站点占座情况,在 seat[84]中表示为[1,1,0,0,0,0,1,1],
索引号 2 至 5 的值都为 0,则当出发站为临海站,目的站为上虞南站,该座位为空座),然后根据购
买者输入的出发站和目的站的站点名称,统计空座数量及相应的座位序号,根据购票信息,输出购
票的具体座位(其中连票数量尽可能多)。
(1)主程序,根据购票步骤,请在划线处填入合适的代码。
#获取列车每个座位号及其在各站点占座情况,存储在二维列表 seat 中,代码略
site=["温岭","台州","临海","天台山","嵊州新昌","嵊州北","上虞南","绍兴北","杭州东"]
begin=site.index(input("输入出发站: ")) #index 方法用于获取列表的索引号
end=site.index(input("输入目的站:"))
tic=gethavet(begin,end) #获取基于出发站和目的站前的所有空座座位序号列表
if len(tic)>0:
num= int(input("尚有余票"+_____①_str(len(tic))____+"张,请输入购买的数量:"))
姓名:_________________学号:_______________班级:____________2022 年 5-12 月选考算法大题
3 / 20
if num<=len(tic):
seatno,ser=assignment (num,tic) #获取相应座位序号及连票数量
#seatno 列表存储格式如:[4,5,6,7,8]或[4,5,6,8,9]
print("购票"+str(num)+"张,其中连票数量"+str(ser)+"张!座位信息如下: ")
snum=['A','B','C','D','F'] #每排座位的编号
for k in seatno:
coach,row=k//85+1,k%85//5+1
_____②___number=snum[k%85%5]__
print(str(coach)+"车厢"+str(row)+"排"+number+"座")
#将新的占座数据写入数据库,代码略
else:
print("购买数量不得大于余票数量! ")
else:
print("余票不足! ")
(2)获取余票数据,如下的 gethavet 函数,获取出发站至目的站前的空座座位序号,保存在列表
s 中并返回。
def gethavet(x,y):
s=[]
for i in range(680):
nows = seat[i] #nows 存储当前序号各个站点的占座情况
if _____③___sum(nows[x:y])==0__:
s.append(i)
return s
(3)座位分配,如下的 assignment 函数,按序号查找连票,如果找到一组连票数量等于购买的数
量,则退出查找并返回相应信息,若连票数量不足,则补充座位数量后返回。
def assignment(n,tic):
maxs,head,tmp = 1,0,1
for i in range(1,len(tic)):
if _____④_tic[i]==tic[i-1]+1____:
tmp += 1
if tmp > maxs:
maxs = tmp
head = i-maxs+1 #记录连票的开始位置
if maxs == n:
break #满足需要的数量,结束查找
else:
tmp=1
#将连票的座位序号存于列表 slist,若连票数量不足则补充座位数量,代码略
return [slist,maxs]
2022 年 11 月台金高二
15.某校举办国庆师生联欢活动,活动时给每位师生发放一个号码(由 6 个不重复的大写字母组成
姓名:_________________学号:_______________班级:____________2022 年 5-12 月选考算法大题
4 / 20
的),在活动结束时将从已发放的号码中找出幸运号码。幸运号码产生过程如下:
①将每个发放的号码与其他所有号码对比,找出该号码的亲密号码,如两号码为亲密号码关系,则
两号码为亲密号码对。
亲密号码:若调换号码 1 中两个位置上的字符得到的号码与号码 2 完全相同,则称号码 1 与号码 2
是一对亲密号码对。如号码“ABCDEF”,调换其位置 3 和位置 5 中的字符“C”、“E”得到号码“ABEDCF”,
即号码“ABCDEF”和“ABEDCF”为一对亲密号码对。
②在所有亲密号码对中,找出出现次数最多的号码作为幸运号码,若出现次数最多的号码有多个,
均作为幸运号码。
#判断 x,y 是否是亲密号码对,如果是返回 True,不是返回 False
def judge(x, y):
a=[]
for i in range(len(x)):
if x[i]!=y[i]:
a.append([x[i],y[i]])
if _____①__len(a)==2 and a[0]==a[1][::-1]___:
return True
else:
return False
f=open('编号.txt', 'r') #打开文件
bh=f.read().split(",") #把各号码存储到列表 bh 中
#从列表 bh 中逐一比对所有号码,找到一对亲密号码,将这对号码存储到列 qmbh 中
qmbh=[]
for i in range(len(bh)-1):
for j in range(i+1,len(bh)) :
if _____②__judge(bh[i],bh[j])___:
qmbh.append([bh[i], bh[j]])
cs={}
#遍历列表 qmbh 中的亲密号码对,统计各号码出现的次数,结果存放在字典 cs 中
for bh_dui in qmbh:
for j in bh_dui:
if j in cs:
_____③___cs[j]+=1__
姓名:_________________学号:_______________班级:____________2022 年 5-12 月选考算法大题
5 / 20
else:
cs[j]=1
#找出出现在亲密号码对中次数最多的号码
for key, value in cs.items():
if _____④__value==max(cs.values())___:
print("获奖编号为" , key)
print(f'与{key}为亲密编号的共{value}个')
2022 年 11 月稽阳
15.某 APP 为增加用户活跃度,采用“签到得积分换奖品”的形式来吸引用户。签到积分的规则与
玩法如下:
①第一天签到得 1 分,第二天签到得 2 分,第三天签到得 3 分,……第 7 天及 7 天以上签到得 7 分;
一旦中途漏签,签到积分从 1 分开始重新计算;积分每年最后一天结束时清零。现在用“1”和“0”
表示签到和未签到,如某用户下载 APP 后第一天到第九天的签到记录为“101111011”,则这 9 天共
获得 14 个积分。
②APP 每年会给用户一次补签一天的机会,补签之后积分的连续性可以持续,例如上面的 9 天中如
果补签第七天增加积分最多,补签后 9 天的签到记录将变为“101111111”,积分将达到 29 分。为
了找出一年中最佳的补签日,设计如下程序:从文件中读取一年 365 天(2 月以 28 天计)的签到记
录并以字符串形式输出,然后统计出全年的积分,并分析出补签增加积分最多那天的日期及将这一
天补签后可增加积分数,程序输出效果如下图所示。
(1)若第 1 天到到第 18 天的签到记录为“101110111001101111”,则补签第____6______天可增加
积分最多。
(2)请在划线处填入合适的代码。
def tongji(s): #统计字符串中的积分
sum,pre=0,0
for i in range(len(s)):
if s[i]=="1":
if pre<7:
pre+=1
sum+=pre
else:
_____①___pre=0__
return sum
def check(ss):
month={1:31,2:28,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31}
max,index=0,0
for i in range(len(ss)):
剩余32页未读,继续阅读
资源评论
沐·黑雨
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功