蓝桥杯:最后一天的复习(Python版)

蓝桥杯:最后一天的复习(Python版),第1张

本人也是第一次参加蓝桥杯..

从二月份开始准备着比赛到现在刚好两个月的时间,不敢说随随便便拿奖,但我知道这段学习备考的过程让我获益良多。


下面是我认为比较重要的一些模版,有需要的可以看一下。


时间有些紧..所以代码都没有附带注释

若是学过对应的算法,可以当作复习来看一下

若是没学过的话,我还是建议去找系统详细的博客学习(考前一天其实复习就好)

若有我表达不清或者有任何不理解的地方,欢迎留言评论。


我会在看到的第一时间做出回答!

若有错误,欢迎指出!


# 求子集
def myset(nums) :
    res = [[]]
    for num in nums :
        res = res + [[num] + i for i in res]
    return res

# 求子串
def mystr(str1) :
    res = []
    for i in range(len(str1)) :
        for j in range(len(str1)-i) :
            res.append(str1[j:j+i+1])
    return res

# 快速幂
def qpow(base,exp) :
    res = 1
    while exp :
        if exp & 1 :
            res *= base
        base *= base
        exp >>= 1
    return res

# 最长上升子序列
numList = [1,2,3,6,4,6,3,8]
dp1 = [1 for i in range(len(numList))]
for i in range(len(numList)) :
    for j in range(i) :
        if numList[j] < numList[i] :
            dp1[i] = max(dp1[i],dp1[j]+1)

# 最长公共子串
str1 = 'abcde'
str2 = 'bbcgd'
maxlen = 0
dp2 = [[0 for i in range(len(str2)+1)] for j in range(len(str1)+1)]
for i in range(1,len(str1)+1) :
    for j in range(1,len(str2)+1) :
        if str1[i-1] == str2[j-1] :
            dp2[i][j] = dp2[i-1][j-1] + 1
        else :
            dp2[i][j] = 0
        maxlen = max(maxlen,dp2[i][j])

# 最长公共子序列        
dp3 = [[0 for i in range(len(str1)+1)]for j in range(len(str2)+1)]
for i in range(1,len(str1)+1) :
    for j in range(1,len(str2)+1) :
        if str1[i-1] == str2[j-1] :
            dp3[i][j] = dp3[i-1][j-1] + 1
        else :
            dp3[i][j] = max(dp3[i-1][j],dp3[i][j-1])
        maxlen = max(maxlen,dp3[i][j])

# 筛法求素数
numList2 = [i for i in range(2,100)]
flag = [True for i in range(100)]
for i in range(2,100) :
    if flag[i] :
        tmp = i + i
        while tmp < 100 :
            flag[tmp] = False
            tmp += i

# 旋转矩阵
matrix1 = [[1,2,3],[4,5,6],[7,8,9]]
matrix2 = [[1,2,3],[4,5,6],[7,8,9]]
# 顺时针打印矩阵 
matrix1 = matrix1[::-1]
ans1 = list(map(list,zip(*matrix1)))
# 逆时针打印矩阵
ans2 = list(map(list,zip(*matrix2)))
ans2 = ans2[::-1]

# 单调栈
# 单调递增 
def IncreasingStack(nums):
    stack = []
    res = []
    for num in nums:
        # 当前值大于栈顶元素,将栈顶元素弹出
        while stack and num >= stack[-1]:
            stack.pop()
        if stack :
            res.append(stack[-1])
        else :
            res.append(-1)
        stack.append(num)
    return res
# 单调递减
def DecreasingStack(nums):
    stack = []
    res = []
    for num in nums :
        while stack and num <= stack[-1]:
            stack.pop()
        if stack :
            res.append(stack[-1])
        else :
            res.append(-1)
        stack.append(num)
    return res

# 二分图求最大匹配

#直接上例题 :
# *    Input
# *      输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。


0


最后一个0结束输入。


# *   Output # *   对于每组数据,输出一个整数,表示可以坐上过山车的最多组合数。


# *   Sample Input # * 6 3 3 # * 1 1 # * 1 2 # * 1 3 # * 2 1 # * 2 3 # * 3 1 # *   Sample Output # *   3 def find(i) : for j in range(1,N+1) : if stuBox[i][j] and used[j] == 0 : #跟他有关系而且没有搜索过 used[j] = 1 if boy[j] == 0 or find(boy[j]) : # 若该男生还没有匹配 或者该男生原配好的女生还能再找到匹配对象 boy[j] = i # 将当前女生与男生相匹配 return True return False K,M,N = map(int,input().split()) stuBox = [[0 for i in range(M+1)]for j in range(N+1)] boy = [0 for i in range(N+1)] sum = 0 for i in range(K) : t1,t2 = map(int,input().split()) stuBox[t1][t2] = 1 for i in range(1,M+1) : used = [0 for i in range(N+1)] # 用于记录该男生是否已经被匹配了 if find(i) : sum+=1 print(sum) # 拓扑排序 def find(Graph) : indegrees = dict((i,0) for i in Graph.keys()) for i in Graph.keys() : for j in Graph[i] : indegrees[j] += 1 stack = [] for i in Graph.keys() : if indegrees[i] == 0 : stack.append(i) seq = [] while stack : tmp = stack.pop() seq.append(tmp) for k in Graph[tmp] : indegrees[k] -= 1 if indegrees[k] == 0 : stack.append(k) if len(seq) == len(Graph) : return seq else : print('有环') # 并查集 lst = [i for i in range(10)] def root(x) : if x != lst[x] : lst[x] = root(lst[x]) return lst[x] def union(x,y) : if root(x) != root(y) : lst[root(x)] = root(y) # 判断是否是回文数 def check_HW(str1) : return str1 == str1[::-1] # 最小生成树 prim #! 最小生成树有prim和kruskal两种算法 #! 一般而言 kruskal更为实用 #! w我是因为用惯了prim了 所以在这里写的prim #! 大家还是尽量记一下kruskal def prim(Graph) : res = 0 sorted_node = [0] candidate_node = [i for i in range(1,len(Graph))] while candidate_node : start,end,minn = 0,0,float('inf') for i in sorted_node : for j in candidate_node : if Graph[i][j] < minn : minn = Graph[i][j] start,end = i,j res += minn candidate_node.remove(end) sorted_node.append(end) return res # 汉诺塔 def hanoi(fromPillar,middlePillar,toPillar,num) : count = 0 if num == 1: count+=1 return else : hanoi(fromPillar,toPillar,middlePillar,num-1) hanoi(fromPillar,middlePillar,toPillar,1) hanoi(middlePillar,fromPillar,toPillar,num-1) return count print(hanoi('A','B','C',4)) #背包问题 N=1010 n,m=map(int,input().split()) v=[0 for i in range(N)] w=[0 for i in range(N)] f=[[0 for i in range(N)] for j in range(N)] for i in range(1,n+1): vv,ww=map(int,input().split()) v[i]=vv w[i]=ww # 01背包 def knapsack(n,m) : for i in range(1,n+1) : for j in range(m+1) : if j < w[i] : f[i][j] = f[i-1][j] else : f[i][j] = max(f[i-1][j],f[i-1][j-w[i]]+v[i]) return f[n][m] # 完全背包 def Total_knapsack(n,m) : for i in range(1,n+1) : for j in range(m+1) : if j < w[i] : f[i][j] = f[i-1][j] else : f[i][j] = max(f[i][j],f[i][j-w[i]+v[i]]) return f[n][m]

———————————————————————————————————————————

海有舟可渡

山有径可行

所爱隔山海

山海皆可平

相信你对算法的热爱和敲下的每一行代码 都不会辜负你! 最后:预祝大家明天考试顺利 统统省一!!!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/567394.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-09
下一篇 2022-04-09

发表评论

登录后才能评论

评论列表(0条)

保存