0
点赞
收藏
分享

微信扫一扫

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

ITWYY 2022-04-08 阅读 66

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

文章目录


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

题目1

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

思路:python一行搞定

答案:539077581

题目2

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

思路:这道题来说的话,两两配对嘛,直接暴力搜索,然后判断条件,符合+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

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

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

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

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

思路:其实这道题也很简单的,最小编号就是我们的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

思路:对于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

思路:灵活运用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

思路,有些人用状压慢慢排序,我们不用,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

思路:压轴题还是难,不过怎么说呢,捞点分吧,我这里借鉴了别人的写法,其实就是高级的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])

举报

相关推荐

0 条评论