本人也是第一次参加蓝桥杯..
从二月份开始准备着比赛到现在刚好两个月的时间,不敢说随随便便拿奖,但我知道这段学习备考的过程让我获益良多。
下面是我认为比较重要的一些模版,有需要的可以看一下。
时间有些紧..所以代码都没有附带注释
若是学过对应的算法,可以当作复习来看一下
若是没学过的话,我还是建议去找系统详细的博客学习(考前一天其实复习就好)
若有我表达不清或者有任何不理解的地方,欢迎留言评论。
我会在看到的第一时间做出回答!
若有错误,欢迎指出!
# 求子集
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]
———————————————————————————————————————————
海有舟可渡
山有径可行
所爱隔山海
山海皆可平
相信你对算法的热爱和敲下的每一行代码 都不会辜负你! 最后:预祝大家明天考试顺利 统统省一!!!欢迎分享,转载请注明来源:内存溢出
评论列表(0条)