1. 在学习这个课程的同时,每三天复习一下算法基础课(重做一下习题),将基础课的知识用思维导图归纳下。
2. 2022.2.12 - 2022.2.24:花两周时间把Python的两套蓝桥杯真题写了
3. 蓝桥杯学完和基础课复习完就刷acwing上的蓝桥杯题(用IDLE编译器coding),这样子一共做过的题目数量应该在300道左右。
Day 1 (2021.12.25)
递归的执行顺序:

2^20 = 10^6
2^63 = 10^8

# acwing 92. 递归实现指数型枚举
# 代码 1,使用append和pop操作
def dfs(u):
if u==n+1:
print(' '.join(map(str,a)))
return
a.append(u)
dfs(u+1)
a.pop()
dfs(u+1)
if __name__ == '__main__':
a = []
n = int(input())
dfs(1)
# 代码 2,使用修改操作
N = 16
def dfs(u):
if u==n+1:
for i in range(1,N):
if a[i]==1: print(i, end=' ')
print()
return
a[u]=1
dfs(u+1)
a[u]=0
dfs(u+1)
if __name__ == '__main__':
a = [0]*N
n = int(input())
dfs(1)

实验后发现对列表赋值这个操作是非常耗时间的



Day 2 (2021.12.26)


# acwing 94. 递归实现排列型枚举
N = 10
def dfs(u):
if u>n:
print(' '.join(map(str, a)))
return
for i in range(1,n+1):
if not st[i]:
st[i] = True
a.append(i)
dfs(u+1)
a.pop()
st[i] = False
return
if __name__ == '__main__':
st, a = [False]*N, []
n = int(input())
dfs(1)



# acwing 93. 递归实现组合型枚举
N = 30
def dfs(u):
if u>m:
print(' '.join(map(str, a)))
return 0
for i in range(1,n+1):
if not st[i]:
if len(a) and a[-1]>i:
continue
st[i] = True
a.append(i)
dfs(u+1)
st[i] = False
a.pop()
return 0
if __name__ == '__main__':
n, m = map(int, input().split())
a, st = [], [False]*N
dfs(1)
# yxc 思路
# -----------------------------------------------------------
N = 30
def dfs(u, start):
# 剪枝
if len(a)+n-start+1 < m: return
if u>m:
print(' '.join(map(str, a)))
return
for i in range(start, n+1):
a.append(i)
dfs(u+1,i+1)
a.pop()
if __name__ == '__main__':
a = []
n, m = map(int, input().split())
dfs(1,1)



# acwing. 1209. 带分数
def count(u, inv_u):
global res
u, idx = str(u), 1
while True:
numerator, denominator, idx = str(idx*inv_u), str(idx), idx+1
if len(numerator) + len(denominator) > 9-len(u): break
s = set(list(numerator+denominator+u))
if '0' in s: continue
for i in range(1,10):
if str(i) not in s: break
if i==9: res+=1
if __name__ == '__main__':
n, res = int(input()), 0
for i in range(1,n):
count(i,n-i)
print(res)
# Acwing 1209. 带分数
# yxc 的思路一,直接全排列的方法超时
N = 10
def count(l,r):
res = 0
for i in range(l,r+1):
res = res*10+a[i]
return res
def check():
global res
for i in range(1,8):
if count(1, i) > n: break
for j in range(i+1,9):
if (n - count(1,i)) * count(i+1,j) == count(j+1,9):
res += 1
def dfs(u):
if u>9:
check()
return
for i in range(1,10):
if not st[i]:
a.append(i)
st[i] = True
dfs(u+1)
st[i] = False
a.pop()
return
if __name__ == '__main__':
n = int(input())
a, st = [0], [False]*N
res = 0
dfs(1)
print(res)
# yxc 的思路 2
N = 10
def check(tmp_a, tmp_c):
global res
tmp_b = (n - tmp_a) * tmp_c
tmp_str = list(str(tmp_b) + str(tmp_c) + str(tmp_a))
if len(tmp_str) != 9: return False
for i in range(1, 10):
if str(i) not in tmp_str: return False
return True
def dfs_c(u, tmp_a, tmp_c):
global res
if u>9: return
if check(tmp_a, tmp_c): res += 1
for i in range(1,10):
if not st[i]:
st[i] = True
dfs_c(u+1, tmp_a, tmp_c*10+i)
st[i] = False
def dfs_a(u, tmp_a):
if tmp_a>=n: return
if tmp_a: dfs_c(u, tmp_a, 0)
for i in range(1,10):
if not st[i]:
st[i] = True
dfs_a(u+1, tmp_a*10+i)
st[i] = False
return
if __name__ == '__main__':
n = int(input())
st = [False]*N
res = 0
dfs_a(0, 0)
print(res)
Day 3 (2021.12.27)
# acwing 717. 简单斐波那契
if __name__ == '__main__':
a, b = 0, 1
n = int(input())
for _ in range(n):
print(a, end=' ')
b, a = a+b, b
Day 4 (2021.12.28)
递归是把子问题分解成同类子问题,递推先把子问题做完,再用子问题把原问题解出来

# acwing 95. 费解的开关
import copy
directions = [(1,0),(0,1),(0,-1),(-1,0),(0,0)]
def turn(x,y,cur_w):
for direction in directions:
a, b = x + direction[0], y + direction[1]
if a>=0 and a<5 and b>=0 and b<5: cur_w[a][b] ^= 1
def light():
res = 0x3f3f3f3f
for op in range(1<<5):
copy_w, step = copy.deepcopy(w), 0
for i in range(5):
if (op>>i)&1:
step += 1
turn(0,i,copy_w)
for i in range(4):
for j in range(5):
if copy_w[i][j]==0:
step += 1
turn(i+1,j,copy_w)
flag = True
for i in range(5):
if copy_w[4][i]==0:
flag = False
break
if flag: res = min(res, step)
return res if res<=6 else -1
if __name__ == '__main__':
n = int(input())
for i in range(n):
w = []
for j in range(5):
w.append([int(x) for x in list(input())])
if i!=n-1: input()
print(light())
Day 5 (2021.12.30)

# acwing 116. 飞行员兄弟
import copy
def turn(x,y,cur_w):
for i in range(4):
if cur_w[x][i] == '+': cur_w[x][i] = '-'
else: cur_w[x][i] = '+'
if cur_w[i][y] == '+': cur_w[i][y] = '-'
else: cur_w[i][y] = '+'
if cur_w[x][y] == '+': cur_w[x][y] = '-'
else: cur_w[x][y] = '+'
def findWay():
ways, res = [], 0x3f3f

博主分享了算法学习的日常,包括递归、树形DP、记忆化搜索、蓝桥杯题目解析等,涉及ACwing平台上的多个题目,如指数型枚举、开关操作、斐波那契数列等,探讨了各种算法思想和优化技巧。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



