蓝桥杯:一些总结

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

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

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

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

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

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

若有我表达不清或者有任何不理解的地方,欢迎留言评论。我会在看到的第一时间做出回答!

若有错误,欢迎指出!


# 求子集
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<K<=1000,1<=N 和M<=500.
# *      接下来的K行,每行有两个数,分别表示女生Ai愿意和男生Bj做partner。最后一个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]

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

海有舟可渡

山有径可行

所爱隔山海

山海皆可平

相信你对算法的热爱和敲下的每一行代码 都不会辜负你!

最后:预祝大家明天考试顺利 统统省一!!!

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UESTC_KS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值