蓝桥杯python第三期模拟赛 python题解

简介: 蓝桥杯python第三期模拟赛 python题解

想着在考前模拟测试一下,就写了这个


题目1


请问十六进制数 2021ABCD 对应的十进制是多少?


print(int('2021ABCD',16))



思路:python一行搞定

答案:539077581


题目2


如果一个整数 M 同时是整数 A 和 B 的倍数,则称 M 是 A 和 B 的公倍数,公倍数中最小的一个正整数称为最小公倍数。

例如:2021 和 86 的最小公倍数是 4042.

请问在 1(含) 到 2021(含) 中,有多少个数与 2021 的最小公倍数是 4042。

from math import gcd
def g(a,b):
    return a*b//gcd(a,b)
cnt = 0
for i in range(1,2022):
    if g(i,2021) == 4042:
        cnt += 1
print(cnt) # 答案3

思路:直接暴力搜索,轻松通过


题目3


10 是一个非常特殊的数,它可以表示成两个非负整数的平方和,10 = 3 * 3 + 1 * 1。

9 也是同样特殊的数,它可以表示成 9 = 3 * 3 + 0 * 0。

请问,在 1 到 2021 中有多少个这样的数?

请注意,有的数有多种表示方法,例如 25 = 5 * 5 + 0 * 0 = 3 * 3 + 4 * 4,在算答案时只算一次。


思路:这道题来说的话,两两配对嘛,直接暴力搜索,然后判断条件,符合+1,轻松通过咯

a = [i*i for i in range(45)]
s = set()
for i in range(len(a)):
    for j in range(len(a)):
        if a[i] + a[j] not in s and 1 <= a[i] + a[j] <= 2021:
            s.add(a[i]+a[j])
# print(s)
print(len(s)) # 答案 624


题目4


下面是一个8个结点的无向图的邻接矩阵表示,其中第 i 行第 j 列表示结点 i 到结点 j 的边长度。当长度为 0 时表示不存在边。

   0 9 3 0 0 0 0 9

   9 0 8 1 4 0 0 0

   3 8 0 9 0 0 0 0

   0 1 9 0 3 0 0 5

   0 4 0 3 0 7 0 6

   0 0 0 0 7 0 5 2

   0 0 0 0 0 5 0 4

   9 0 0 5 6 2 4 0

   请问,这个图的最小生成树大小的多少?


思路这道题的话就是最小生成数嘛,我们可以直接套模板,也是很简单的

a = ['0 9 3 0 0 0 0 9',
'9 0 8 1 4 0 0 0',
'3 8 0 9 0 0 0 0',
'0 1 9 0 3 0 0 5',
'0 4 0 3 0 7 0 6',
'0 0 0 0 7 0 5 2',
'0 0 0 0 0 5 0 4',
'9 0 0 5 6 2 4 0']
graph = [[0]*9 for _ in range(9)]
for i in range(8):
    a[i] = a[i].split(' ')
    for j in range(8):
        graph[i+1][j+1] = int(a[i][j])
def find(x):
    if father[x] != x:
        father[x] = find(father[x])
    return father[x]
def union(x,y):
    fx,fy = find(x),find(y)
    if fx!=fy:
        father[fx] = fy
father = [i for i in range(9)]
ans = 0
for x in range(1,8):
    w = float('inf')
    for i in range(1,9):
        for j in range(1,9):
            # 首先有边
            if graph[i][j] != 0 and find(i) != find(j):
                if w > graph[i][j]:
                    w = graph[i][j]
                    a = i
                    b = j
    ans += w
    union(a,b)
    print(a,b,w)
print(ans) # 答案26


题目5


下面是一个20*20的矩阵,矩阵中的每个数字是一个1到9之间的数字,请注意显示时去除了分隔符号。

矩阵中一个子矩阵的值是指子矩阵中所有数值的和。

请问,矩阵中值最大的一个5*5的子矩阵的值是多少?


txt   69859241839387868941   17615876963131759284   37347348326627483485   53671256556167864743   16121686927432329479   13547413349962773447   27979945929848824687   53776983346838791379   56493421365365717745   21924379293872611382   93919353216243561277   54296144763969257788   96233972513794732933   81443494533129939975   61171882988877593499   61216868895721348522   55485345959294726896   32124963318242554922   13593647191934272696   56436895944919899246    


思路,简单点就是暴力搜索呀,有些人用前缀和,我个人觉得填空题没必要


a = ['69859241839387868941',
'17615876963131759284',
'37347348326627483485',
'53671256556167864743',
'16121686927432329479',
'13547413349962773447',
'27979945929848824687',
'53776983346838791379',
'56493421365365717745',
'21924379293872611382',
'93919353216243561277',
'54296144763969257788',
'96233972513794732933',
'81443494533129939975',
'61171882988877593499',
'61216868895721348522',
'55485345959294726896',
'32124963318242554922',
'13593647191934272696',
'56436895944919899246']
ans = 0 
for i in range(16):
    for j in range(16):
        sum = 0
        for x in range(i,i+5):
            for y in range(j,j+5):
               sum += int(a[x][y])
        if ans  < sum:
            ans = sum
print(ans) # 154

题目6


【问题描述】


小蓝要写一个网页显示一些商品。


商品总共有 t 个,按顺序由 1 到 t 编号,每页显示 a 个,请问第 p 页显示的最小和最大编号是多少?


【输入格式】


输入一行包含三个整数 t、a、p,相邻整数之间用一个空格分隔。


【输出格式】


输出一行包含两个整数,分别表示最小和最大编号。


【样例输入】

 31 10 3


【样例输出】


21 30


【样例输入】


31 10 4


【样例输出】


31 31


【评测用例规模与约定】


对于所有评测用例,1 <= t <= 1000,1 <= a <= 100,1 <= p。保证第 p 页至少显示一个商品



思路:其实这道题也很简单的,最小编号就是我们的a*(p-1) + 1,就是上一页的最大值+1,最大编号是min(t, a * p)


t,a,p = map(int,input().split())
print(a*(p-1)+1,min(t,a*p))


题目7


【问题描述】


给定一个正整数 n,请判断 n 的所有数位上的值是否从左到右是严格递增的。


例如:1589 是严格递增的 。


再如:1336 不是严格递增的,中间有相同的 3。


再如:1598 不是严格递增的。


【输入格式】


输入一行包含一个正整数 n。


【输出格式】


如果是严格递增的,输出“YES”(全大写),否则输出“NO”(全大写)。


【样例输入】


1589


【样例输出】


YES


【样例输入】


1336


【样例输出】


NO


【评测用例规模与约定】


对于所有评测用例,1 <= n <= 1000000000。


思路:对于python来说,就是逐一判断了,不符合直接退出,O n的算法

s = input()
for i in range(len(s)-1,0,-1):
    if s[i] > s[i-1]:
        flag = True
    else:
        flag = False
        break
if not flag:
    print('NO')
else:
    print('YES')

题目8


【问题描述】


小蓝将自己的车停在路边,在同一天将车开走。给定停车时间和开走时间,请问小蓝停了多长时间?


【输入格式】


输入两行,第一行包含停车时间,第二行包含开走时间。


每个时间的格式为 HH:MM:SS,其中 HH 表示时,值为 0 到 23 的整数,如果小于 10 用 0 补齐两位;MM 和 SS 分别表示分和秒,值为 0 到 59 的整数,小于 10 时用 0 补齐两位。


【输出格式】


输出总共停车的时间,格式为 HH:MM:SS。


【样例输入】


08:58:10

 17:20:31


【样例输出】


08:22:21


思路:灵活运用datetime库,完美嘻嘻


import datetime
s = input()
e = input()
def change(x):
    x = x.split(':')
    date = datetime.datetime(2022,4,8,hour=int(x[0]),minute=int(x[1]),second=int(x[2]))
    return date
s = change(s)
e = change(e)
print(e-s)


题目9


【问题描述】


n 个运动员参加一个由 m 项运动组成的运动会,要求每个运动员参加每个项目。


每个运动员在每个项目都有一个成绩,成绩越大排名越靠前。每个项目,不同运功员的成绩不会相同,因此排名不会相同。(但是不同项目可能成绩会相同)


每个项目的前 k 名分别获得 k 到 1 分,第 i 名获得 max(k+1-i, 0) 分。


每个运动员的总分就是他在每个项目上获得的分数之和。


请计算每个运动员的总分。


【输入格式】


输入的第一行包含两个整数 n, m, k,用一个空格分隔。


接下来 n 行,每行包含 m 个整数,第 i 行第 j 个整数表示第 i 个运动员在第 j 项比赛的成绩。


【输出格式】


输出一行包含 n 个整数,依次表示每个运动员的总分,相邻的整数之间用一个空格分隔。


【样例输入】


3 5 2

 5 3 1 5 12

 2 4 2 34 1

 8 6 3 2 2


【样例输出】


4 4 7


【样例说明】


第 1 个运动员得分为:1+0+0+1+2=4

  第 2 个运动员得分为:0+1+1+2+0=4

  第 3 个运动员得分为:2+2+2+0+1=7


【评测用例规模与约定】


对于 50% 的评测用例,2 <= n, m, k <= 20,0 <= 成绩 <= 1000。

  对于所有评测用例,2 <= n, m, k <= 100,0 <= 成绩 <= 10000。


思路,有些人用状压慢慢排序,我们不用,python有key排序,多简单,我们只要指定key就可以了,嘻嘻


n,m,k = map(int,input().split())
import time
a = []
for i in range(n):
    a.append(list(map(int,input().split()))+[i])
s = [0]*n
for i in range(m):
    a.sort(key=lambda x:x[i])
    #a = sorted(a,key=lambda x:x[i])
    for j in range(n):
        s[a[j][-1]] += j
print(' '.join(map(str,s)))


题目10


【问题描述】给定 n 个整数 a[1], a[2], …, a[n],小蓝希望在中间选出一部分,满足以下两个条件:


1、对于某个下标集合 S,选出的数中有至少 k 个下标在集合 S 中;


2、选出的数按照原来的顺序排列,是严格单调上升的,即选出的是一个上升子序列。


请问小蓝最多能选出多少个数。


【输入格式】


输入的第一行包含两个整数 n, k,用一个空格分隔。


第二行包含 n 个整数 a[1], a[2], …, a[n],相邻的整数间用空格分隔。


第三行包含一个长度为 n 的01串,依次表示每个下标是否在集合 S 中,为 0 表示不在 S 中,为 1 表示在 S 中。


【输出格式】


输出一行包含一个整数,表示答案。如果没有满足条件的选法,输出-1。


【样例输入】


8 2

 8 1 2 3 9 4 7 10

 10001010


【样例输出】


3


【样例说明】


由于 8、9、7 三个数中至少要选 2 个,只能选 8 和 9,剩下的数只能选最后一个数 10。


【样例输入】


8 3

 8 1 2 3 9 4 7 10

 10001010


【样例输出】


-1


【 评测用例规模与约定】


对于 30% 的评测用例,2 <= n <= 100,0 <= a[i] <= 100, 0 <= k <= 3。

  对于所有评测用例,2 <= n <= 1000,0 <= a[i] <= 100000, 0 <= k <= 20。



思路:压轴题还是难,不过怎么说呢,捞点分吧,我这里借鉴了别人的写法,其实就是高级的LIS


最后思路是动态规划,想懂的可以详细研究代码,明天考试,还要复习,就不详细写了。

# DFS写法,过不了30%
n,k = map(int,input().split())
a = list(map(int,input().split()))
s = input()
ans = 0
# cnt 代表s中下标的个数,idx是从这部分可以深度搜索
# length是长度
def dfs(cnt,idx,length):
    global ans
    if s[idx] == '1': # 如果遇到1 
        cnt += 1
    length += 1
    if idx == n-1 and cnt >= k:
        ans = max(ans,length)
    for i in range(idx+1,n):
        if a[i] > a[idx]:
            dfs(cnt,i,length)
for i in range(n):
    dfs(0,i,0)
print(ans)
# 邪恶的DP
# dp[i][j]表示取i个数中,至少有j个数在s下标下的长度
n,k = map(int,input().split())
a = list(map(int,input().split()))
s = input()
dp = [[-1]*(k+1) for _ in range(n+1)]
dp[0][0] = 1
if s[0] == '1':
    dp[0][1] = 1
for i in range(1,n):
    dp[i][0] = 1 # 单独一个i最少可以
    for j in range(k): # 去s中的数
        # a[i]为下标数
        if s[i] == '1' and j > 0:
            flag = True
        else:
            flag = False
        for x in range(1,i):
            # 从前面寻找最大的序列
            if a[x] > a[j]: continue
            # a[i] 在s中
            if flag:
                if dp[x][j-1] == -1:
                    continue
                dp[i][j] = max(dp[i][j],dp[x][j-1] + 1)
            else:
                if dp[x][j] == -1:
                    continue
                dp[i][j] = max(dp[i][j],dp[x][j] + 1) 
print(dp[n-1][k])


相关文章
|
3月前
|
索引 Python 容器
【备战蓝桥杯】探索Python内置标准库collections的使用
【备战蓝桥杯】探索Python内置标准库collections的使用
49 1
|
3月前
|
开发者 Python
【备战蓝桥杯】如何使用Python 内置模块datetime去计算我与CSDN相遇的天数
【备战蓝桥杯】如何使用Python 内置模块datetime去计算我与CSDN相遇的天数
30 1
|
3月前
|
算法 测试技术 编译器
蓝桥杯-02-python组考点与14届真题
蓝桥杯-02-python组考点与14届真题
|
3月前
|
Python
第十三届蓝桥杯B组python(试题A:排列字母)
第十三届蓝桥杯B组python(试题A:排列字母)
25 0
|
3月前
|
人工智能 算法 测试技术
第十四届蓝桥杯第三期模拟赛 【python】(二)
第十四届蓝桥杯第三期模拟赛 【python】(二)
|
3月前
|
测试技术 Python
第十四届蓝桥杯第三期模拟赛 【python】(一)
第十四届蓝桥杯第三期模拟赛 【python】(一)
|
3月前
|
人工智能 算法 测试技术
第十四届蓝桥杯第二期模拟赛 【python】
第十四届蓝桥杯第二期模拟赛 【python】
|
人工智能 Python
Python 蓝桥杯 动态规划 2道例题+配套1道历年真题
Python 蓝桥杯 动态规划 2道例题+配套1道历年真题
90 0
Python 蓝桥杯 动态规划 2道例题+配套1道历年真题
|
存储 索引 Python
Python蓝桥杯真题——砝码称重
Python蓝桥杯真题——砝码称重
375 0
|
8天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。