飞道的博客

第十二届蓝桥杯模拟赛Python组(第三期)

414人阅读  评论(0)

第一题


# 问题描述
#   请问在 1 到 2020 中,有多少个数与 2020 互质,即有多少个数与 2020 的最大公约数为 1。
# 答案提交
#   这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
co = 0
for i in range(1,2021):
    if i % 2 == 0 or i % 5 == 0 or i % 101 == 0:
        co += 1
print(2020-co)

答案:800

第二题


# 问题描述
# ASCII 码将每个字符对应到一个数值(编码),用于信息的表示和传输。在 ASCII 码中,英文字母是按从小到大的顺序依次编码的,例如:字母 A 编码是 65, 字母 B 编码是 66,字母 C 编码是 67,请问字母 Q 编码是多少?
# 答案提交
#   这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
print(ord('Q'))
'''
ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,
它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 
字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。
'''

答案:81

第三题


n2 = 1000
n0 = n2 + 1         # 二叉树最重要的性质
print(n0)

答案:1001

第四题


'''
问题描述
  对于整数 v 和 p,定义 Pierce 序列为:
  a[1] = v
  a[i] = p % a[i-1]
  例如,当 v = 8, p = 21 时,对应的 Pierce 序列为
  a[1] = 8
  a[2] = 5
  a[3] = 1
  再往后计算,值变为 0,不在我们考虑的范围内。因此当 v = 8, p = 21 时, Pierce 序列的长度为 3。
  当 p 一定时,对于不同的 v 值,Pierce 序列的长度可能不同。当 p = 8 时,若 1<=v<p,最长的 Pierce 序列出现在 v=13时,为(13, 8, 5, 1),长度为 4。
  当 p=2021 时,最长的 Pierce 序列出现在 v=1160 时,请问这个序列有多长?'''

def Pierce(p,v):
    a = []
    while v>0:
        for i in range(1,100):
            if i==1:
                a.append(v)
            else:
                if a[i-2]==0:
                    break
                else:
                    a.append(p%a[i-2])
                    v = a[i-1]
    a.pop()
    return a,len(a)
print(Pierce(2021,1160))

答案:12

第五题


# 问题描述
#   在 Excel 中,第 1 列到第 26 列的列名依次为 A 到 Z,从第 27 列开始,列名有两个字母组成,第 27 列到第 702 列的列名依次为 AA 到 ZZ。
#   之后的列再用 3 个字母、4 个字母表示。
#   请问,第 2021 列的列名是什么?
dic = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q',
       'R','S','T','U','V','W','X','Y','Z']
a = []
for i in dic:
    for j in dic:           # 依次循环迭代
        for v in dic:
            index = i + j + v
            a.append(index)
print(a[2021-702-1])        # 索引从0开始,所以要减一

答案:BYS

第六题


'''
问题描述
  在书写一个较大的整数时,为了方便看清数位,通常会在数位之间加上逗号来分割数位,具体的,从右向左,每三位分成一段,相邻的段之间加一个逗号。
  例如,1234567 写成 1,234,567。
  例如,17179869184 写成 17,179,869,184。
  给定一个整数,请将这个整数增加分割符后输出。
输入格式
  输入一行包含一个整数 v。
输出格式
  输出增加分割符后的整数。
样例输入
1234567
样例输出
1,234,567
样例输入
17179869184
样例输出
17,179,869,184
数据规模和约定
  对于 50% 的评测用例,0 <= v < 10^9 (10的9次方)。
  对于所有评测用例,0 <= v < 10^18 (10的18次方)。
'''
v = int(input())
print('{:,}'.format(v))     # 逗号在这里表示千位分隔符
# 这是刚入门Python学的知识啊,考试的时候竟然没想到

第七题


'''
问题描述
  小蓝正在写一个网页显示一个新闻列表,他需要将总共 n 条新闻显示,每页最多可以显示 p 条,请问小蓝至少需要分多少页显示?
  例如,如果要显示2021条新闻,每页最多显示10条,则至少要分203页显示。
输入格式
  输入的第一行包含一个整数 n,表示要显示的新闻条数。
  第二行包含一个整数 p,表示每页最多可以显示的条数。
输出格式
  输出一个整数,表示答案。
样例输入
2021
10
样例输出
203
样例输入
2020
20
样例输出
101
数据规模和约定
  对于所有评测用例,1 <= n <= 10000,1 <= p <= 100。
'''
n = int(input())    # 新闻条数
p = int(input())    # 显示条数

if n%p == 0:
    count = n/p
else:
    count = n//p + 1
print(int(count))

第八题


'''
问题描述
  杂货铺老板一共有N件物品,每件物品具有ABC三种属性中的一种或多种。从杂货铺老板处购得一件物品需要支付相应的代价。
  现在你需要计算出如何购买物品,可以使得ABC三种属性中的每一种都在至少一件购买的物品中出现,并且支付的总代价最小。
输入格式
  输入第一行包含一个整数N。
  以下N行,每行包含一个整数C和一个只包含"ABC"的字符串,代表购得该物品的代价和其具有的属性。
输出格式
  输出一个整数,代表最小的代价。如果无论如何凑不齐ABC三种属性,输出-1。
样例输入
5
10 A
9 BC
11 CA
4 A
5 B
样例输出
13
数据规模和约定
  对于50%的评测用例,1 <= N <= 20
  对于所有评测用例,1 <= N <= 1000, 1 <= C <= 100000
'''
n = int(input())
string = ['' for i in range(n)]
value = [0 for i in range(n)]

for i in range(n):
    temp = input().split()
    value[i] = int(temp[0])
    string[i] = temp[1]

def dfs(zifu,cost,index):
    min_cost = float('inf')
    if 'A' in zifu and 'B' in zifu and 'C' in zifu:
        return cost
    # if index>n:
    #     return float('inf')
    for i in range(index,n):
        print(''.join([zifu,string[i]]),cost+value[i],i+1)
        cost1 = dfs(''.join([zifu,string[i]]),cost+value[i],i+1)
        if cost1<min_cost:
            min_cost = cost1
    return min_cost

min_cost = dfs('',0,0)
print(min_cost)

第九题


'''
问题描述
  给定一个矩阵 M,由 n 行 m 列组成,第 i 行第 j 列值为 M[i][j]。
  定义矩阵 M 的重量为矩阵中所有元素的和,记为weight(M)
  请找到矩阵左上角的一个子矩阵S(矩阵的前 r 行中的前 c 列组成),使得这个子矩阵的重量的两倍最接近矩阵 M 重量。即 |2 weight(S)-weight(M)| 最小。
  如果有多个子矩阵满足条件,请找出面积 r * c 最小的一个。
  如果仍然有多个子矩阵满足条件,请找出其中 r 最小的一个。
输入格式
  输入第一行包含两个整数 n, m,表示矩阵的大小。
  接下来 n 行,每行 m 个整数,表示给定的矩阵M。
输出格式
  输出一行,包含两个整数 r, c,表示子矩阵为矩阵 M 的前 r 行中的前 c 列。
样例输入
3 4
3 0 1 1
1 0 1 1
1 1 -2 4
样例输出
2 3
数据规模和约定
  对于 30% 的评测用例,1 <= n, m <= 20, -10 <= M[i][j] <= 10。
  对于 50% 的评测用例,1 <= n, m <= 100, -100 <= M[i][j] <= 100。
  对于所有评测用例,1 <= n, m <= 1000, -1000 <= M[i][j] <= 1000。
'''
n,m = map(int,input().split())
dp = [[0]*m for i in range(n+1)]
value = []
weight = 0
for i in range(n):
    value.append(list(map(int,input().split())))
    weight += sum(value[i])
# print(dp)
# print(weight)
answer_value = float("inf")     # 初始化为无穷大
answer_area = float("inf")      # 初始化为正无穷
for r in range(1,n):
    for c in range(1,m):
        dp[r][c] = dp[r-1][c] + dp[r][c-1] - dp[r-1][c-1] + value[r][c]     # 二维前缀和
        differ = abs(2*dp[r][c] - weight)
        if (differ<answer_value and r*c<answer_area):
            answer = (r,c)
            answer_area = r*c
        else:
            answer = (r, c)
            answer_area = r * c

print(answer[0],answer[1])

第十题

n,k = map(int,input().split())
S = list(map(int,input().split()))
dp =[[0 for i in range(k+1)] for j in range(n+1)] #
for i in range(n):
    dp[i][1]  = 1   #将所有元素都有长度为1的递增序列
for i in range(n):
    for j in range(i): 
        if(S[i]>S[j]):
            for l in range(2,k+1): #也就是在k的
                dp[i][l] = (dp[j][l-1]+dp[i][l]) % 1000007  #动规方程

maxvalue=0
for i in range(n):
    maxvalue = (maxvalue+dp[i][k])%1000007	#相加所有位
print(maxvalue)


转载:https://blog.csdn.net/m0_46405703/article/details/115330305
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场