AcWing 蓝桥杯C++ AB组辅导课学习记录(Python,备战蓝桥杯)Day1 - Day30

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

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
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值