
2022年全国高校计算机能力挑战赛Python程序设计国赛
2022年全国高校计算机能力挑战赛Python程序设计国赛
第一题
疫情期间,各地市只能通过火车进行大宗货物的长途运输,为了节省时间和减少不必要的接触,车站会预先将货物装车,等火车头路过时直接挂载到列车尾部。现有一批已经预装好的不同类型的货物(以装载该种货物车厢的单位车厢载重量和车厢数量形式出现)。并且给出当前火车头可以承受的总载重量和已经挂载的货物重量。试求在挂载车厢的载货总量不大于火车头可以承受的总载重量时,可以挂载最多的车厢数量。
备注:由于装同一种货物的车厢已经事先连接到一起,所以挂载时就必须一并挂载,不能分开挂载。
【输入说明】
第一行是火车的车头编号(字符串)、最大承受的总载重量(1000<K<12000)和已挂载的货物重量(0<F<K/2)。之后是一个整数N(1<N<100),表示可供挂载的车厢种类数量。接下来N行是N个装不同货物的单位车厢载重和对应车厢数量。
【输出说明】
车头编号和在本站可挂载的最多车厢数量。中间用‘+’号连接。
【输入样例】
HX1-001 6000 2000
6
100 20
80 30
120 20
100 15
120 10
90 10
【输出样例】
HX1-001+45
【解析与思路】
这应该是这里面最难的一道了,一个简单的01背包算法。
【Python程序代码】
s, k, f = input().split()
k, f = int(k), int(f)
V = k - f
n = int(input())
dp = [0] * (12010)
for i in range(n):
w, v = map(int, input().split())
for j in range(V, -1, -1):
if j >= w * v:
dp[j] = max(dp[j], dp[j - w * v] + v)
print(s + '+' + str(dp[V]))
第二题
这某电子产品有四种不同的配件A、B、C、D,但价格相同,供顾客选配。仅选其中一种时,销售价格为该配件的原始价格;选取两种或三种不同配件时,配件价格为原始价格的80%;如果四种配件都选,价格是原始价格的50%。现在班上有若干名同学采购了这款电子产品,但每个同学对配件的需求不尽相同,请帮他们进行组合,计算该班级最少需要支付多少货款才能满足所有同学的购物要求。
【输入说明】
这第一行是整数N(N<=1000),表示需要采购配件的同学人数;
这第二行是配件的价格,保留到小数点后1位;
这第三行是每个同学的配件需求。每位同学的需求用字符串表示,如需要配件B和D,则用BD表示其需求;同学的需求之间用空格隔开。
【输出说明】
一个浮点数,精确到小数点后1位,表示该班需要支付的货款。
【输入样例】
10
100.0
A BD C C B ABCD BCD A D B
【输出样例】
920.0
【解析与思路】
不管是一个人买ABC还是单买一个A什么的,可以先一整套一整套ABCD买,然后两个两个或三个三个买,具体看代码。
【Python程序代码】
n = int(input())
pri = float(input())
s = list(input().split())
mp = [0]*4
for tep in s:
for i in tep:
if i=='A':mp[0]+=1
if i=='B':mp[1]+=1
if i=='C':mp[2]+=1
if i=='D':mp[3]+=1
mp.sort()
t0 = mp[0]
res = t0*4*pri*0.5
for i in range(4):mp[i]-=t0
if mp[1]+mp[2]>=mp[3]:
res += sum(mp[1:])*pri*0.8
else:
res += sum(mp[1:3])*2*pri*0.8 + (mp[3]-mp[1]-mp[2])*pri
print("%.1f"%res)
第三题
某字符串描述了一个单链表“[节点的值->节点的值]…[节点的值->节点的值]”,但并非严格按照节点的顺序关系描述,两个节点前后关系描述如下:每个中括号中包含了一个节点及其后继节点的值(为整数),之间由’->’链接,表示前驱后继关系,如[23->34][45->56][34->45]表示链表节点的顺序为23->34->45->56。
读入这个链表,判断其有序性(递增、递减、无序)。
【输入说明】
单链表的描述字符串 (长度≤200,测试案例输入的字符串确保能表示一个完整的单链表,每相邻节点的关系都含在字符串中而且仅含一次,且链表中各节点的值均不相等)
【输出说明】
如果递增,则输出“INC”,递减输出“DEC”,无序则输出“NUL”;
【输入样例】
[56->45][23->34][45->23]
【输出样例】
NUL
【解析与思路】
数据量不大,可以直接从每一个点开始枚举,走一遍就可以了,看看有没有上升和下降段。
【Python程序代码】
from collections import *
s = input()
s = s[1:len(s) - 1].split('][')
mp = defaultdict(int)
st = []
for i in s:
a, b = map(int, i.split('->'))
mp[a] = b
st.append(a)
inc, edc, nul = 0, 0, 0
for i in st:
tep = i
pre = i
while mp[tep] != 0:
tep = mp[tep]
if tep > pre: inc = 1
if tep < pre: edc = 1
pre = tep
if inc and edc: print("NUL")
if inc and (not edc): print("INC")
if (not inc) and edc: print("EDC")
第四题
一门课程的最终成绩分数M可以转换为A、B、C、D四档,其中,获得A档成绩表示这门课程的成绩得分在85分及以上(85<=M<=100),B档是75分至84分(75<=M<=84),C档是60分至74分(60<=M<=74),D档是60分以下(0<=M<=59)。现给出某个班的原始成绩,请输出各档成绩的人数。
【输入说明】
第一行为该班级人数(正整数,不大于50)
第二行为每个人的成绩(非负整数,不大于100),中间以空格隔开
【输出说明】
第一行输出为’A’和A档的人数,中间以空格隔开
第二行输出为’B’和B档的人数,中间以空格隔开
第三行输出为’C’和C档的人数,中间以空格隔开
第四行输出为’D’和D档的人数,中间以空格隔开
【输入样例】
10
80 90 83 67 78 50 82 86 73 70
【输出样例】
A 2
B 4
C 3
D 1
【解析与思路】
一个if的语法
【Python程序代码】
n = int(input())
a = list(map(int,input().split()))
mp = [0]*4
for i in a:
if 85<=i<=100:mp[0]+=1
if 75<=i<=84:mp[1]+=1
if 60<=i<=74:mp[2]+=1
if 0<=i<=59:mp[3]+=1
print('A',mp[0])
print('B',mp[1])
print('C',mp[2])
print('D',mp[3])
第五题
一个含有N个整数的序列,请输出符合以下条件的数:其值的三次方大于该数列之和的数。符合条件的数按原序输出。
【输入说明】
第一行是整数N(N<1000)
第二行是N个整数,以空格隔开。
【输出说明】
输出所有符合条件的整数,数字之间用空格隔开,所有数据输出后换行
【输入样例】
6
-8 9 2 6 3 7
【输出样例】
9 6 3 7
【解析与思路】
也是语法题洛,这比赛难一点的都放开头是吧
【Python程序代码】
9 6 3 7n = int(input())
a = list(map(int,input().split()))
suma = 0
for i in a:suma+=i
for i in a:
if i**3>suma:
print(i,end=' ')

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)