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=' ')

猜你喜欢

转载自blog.csdn.net/w2563216521/article/details/134820016