黑板报网

分享生活百科、日常生活经验及知识

第14届蓝桥杯Python国赛真题解析(简版)

avatar 2023-05-28 21:53 196次浏览 评论已关闭 教育

选择题(50分)

第⼀题:执⾏下列代码,输出结果是?(10分)

list = [3, 52, 8, 21, 17]

for i in range(len(list)):

if list[i] % 2 == list[i+1] % 2:

break

print(i)

A 1

B 2

C 3

D 52

答案:A 1

第⼆题:下列哪⼀种数据类型不可修改?(10分)

A 列表

B 元组

C 字典

D 集合

答案:B 元组

第三题:a=[1, 2, 3, 4, 5],b=[5, 4, 3, 2, 1],下列何者不正确?(10分)

答案:C a[2] == a[-2]

第四题(10分)

答案:D

第五题(10分)

答案:A

 

编程题(350分)

第⼀题:拆数字使差最⼩(20分)

输⼊⼀个正整数N,将N拆分成两个正整数,使差最⼩。例如4拆分成2和2,5拆分成3和2

输⼊描述:

输⼊⼀个正整数

输出描述:

分两⾏输出拆分后的两个正整数,如果不⼀样⼤则先输出⼤的

输⼊样例:

5

输出样例:

3

2

答案:n = int(input())

print(n // 2 + n % 2)

print(n // 2)

 

第⼆题:买⼆免⼀(40分)

超市促销活动,每买两个商品,只要付价钱⽐较⾼的那⼀件商品的价钱,另⼀个免费。例如⼩明买的商品价格分别为27、45、92、96、56、12,则96、92⼀对,56、45⼀对,27、12⼀对,只要付179元

输⼊描述:

购买的商品价格,以英⽂逗号分隔

输出描述:

输出最少需要付多少钱

输⼊样例:

27, 45, 92, 96, 56, 12

输出样例:

179

答案:l = sorted([int(i) for i in input().split(“,”)], reverse = True)

m = []

for i in range(0, len(l), 2):

m.append(l[i])

print(sum(m))

 

第三题:碱基对病变(50分)

正常的碱基对为A对应T,C对应G。例如第⼀⾏输⼊ATG,第⼆⾏输⼊GMC,则A对应G,T对应M,G对应C,有2对发⽣病变。

输⼊描述:

第⼀⾏输⼊⼀个字符串

第⼆⾏输⼊⼀个字符串

输出描述:

输出⼀个整数,表示病变的碱基对对数

输⼊样例:

ATG

GMC

输出样例:

2

答案:s1 = input()

s2 = input()

d = {“A”:”T”, “C”:”G”, “G”:”C”, “T”:”A”}

c = 0

for i in range(len(s1)):

try:

if d[s1[i]] != s2[i]:

c += 1

except:

c += 1

print(c)

 

第四题:⾸尾数(60分)

如果⼀个数字除以它的开头数字的余数等于它的结尾数字,则这个数字称为⾸尾数。例如21除以2的余数是1,和结尾数字的1相等,就称为⾸尾数。请你求出n到m(包含n和m)之间的⾸尾数个数。

输⼊说明:

第⼀⾏输⼊⼀个正整数n

第⼆⾏输⼊⼀个正整数m

输出说明:

n到m(包含n和m)之间的⾸尾数个数

输⼊样例:

1

100

输出样例:

46

答案:n = int(input())

m = int(input())

c = 0

for i in range(n, m + 1):

if i % int(str(i)[0]) == i % 10:

c += 1

print(c)

 

第五题:英⽂单词⼦串(80分)

给定⼀个字符串和N个英⽂单词(以英⽂逗号分隔),找出该字符串内符合条件的⼦串,并打印出每⼀个符合条件的⼦串第⼀个字符在原字符串的索引组成的列表。

符合条件的⼦串需要符合以下条件:⼦串内只有N个单词,包含给定的每个单词并全部相邻,单词顺序不拘

例1:onionfishspicfoodfishonion

给定的单词为fish,onion

则输出[0, 17]

例2:dwnucnukcwdiuwkjdjc

给定的单词为apple,coconut

则输出[]

输⼊描述:

第⼀⾏输⼊⼀个字符串

第⼆⾏输⼊N个英⽂单词(以英⽂逗号分隔)

输出描述:

每⼀个符合条件的⼦串的第⼀个字符在原字符串中的索引

输⼊样例:

onionfishfoodspifishonionfoodspicfoodfishonion

fish,food,onion

输出样例:

[0, 16, 33]

答案:正确率90%,不确定对

s = input()

l = input().split(“,”)

m = []

for i in range(len(s)):

f = True

for j in l:

if j not in s[i:i + len(“”.join(l))]:

f = False

break

if f:

m.append(i)

print(m)

 

第六题:有限时间最⼤盈利(100分)

公司要在有限的时间t内,在n件能盈利的事内挑选⼀些事做,并且要最⼤盈利。例如有3件事,要在55分钟之内做完,第⼀件事需要做21分钟,盈利9元;第⼆件事20分钟,盈利2元;第三件事30分钟,盈利21元;可以选择做第⼀件事和第三件事盈利30元。

输⼊描述:

第⼀⾏输⼊正整数t和n,以空格分隔

接下来n⾏分别输⼊需要的时间和盈利

输出描述:

输出在有限时间t内的最⼤盈利

输⼊样例:

55 3

21 9

20 2

30 21

输出样例:

30

t, n = [int(i) for i in input().split()]

l = [[], []]

for i in range(n):

a = [int(i) for i in input().split()]

l[0].append(a[0])

l[1].append(a[1])

o = []

for i in range(2 ** len(l[0])):

a = str(bin(i))[2:]

a = “0” * (len(l[0]) – len(a)) + a

m = [[], []]

for j in range(len(a)):

if a[j] == “1”:

m[0].append(l[0][j])

m[1].append(l[1][j])

if sum(m[0]) <= t:

o.append(sum(m[1]))

print(max(o))