常规练习
十进制转化2进制
1、写函数采用 %2 的方式来算。
binary = lambda n: ‘’ if n==0 else binary(n/2) + str(n%2) binary(5)
‘101’
2、采用 python 自带了方法 bin 函数,比如 bin(12345) 回返回字符串 ‘0b11000000111001’, 这个时候在把0b去掉即可:
bin(12345).replace(‘0b’,’’)
‘11000000111001’
3、也可以采用字符串的 format 方法来获取二进制:
“{0:b}”.format(12345)
‘11000000111001’
十六进制转十进制
print(int(input(),16))
0-1背包问题
dp = [[0 for _ in range(C+1)] for _ in range(n+1)]
def ks(n,C):
if dp[n][C]!=0:
return dp[n][C]
if n==0 or C==0:
result = 0
elif w[n] > C:
result = ks(n-1,C)
else:
temp1 = ks(n-1,C)
temp2 = v[n] + ks(n-1, C - w[n])
result =max(temp1, temp2)
#print(n,C,result)
dp[n][C] = result
return result
'''
n, C = list(map(int, input().split(',')))
w = v = [0]
for x in range(n):
w1, v1 = list(map(int, input().split(',')))
w.append(w1)
v.append(v1)
'''
n,C = 3,5
w = [0, 1, 2, 3]
v = [0, 2, 4, 3]
res = ks(n,C)
print(res)
print(dp)
# 详见b站【蓝桥杯Python省赛集训】 https://www.bilibili.com/video/BV16M411M72d
基础练习 01字串
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。
for i in range(2**5): print(f'{i:05b}')
蓝桥杯—入门训练—Fibonacci斐波那契数列(Python解法)http://t.csdnimg.cn/W9zMp(保留疑问:为什么取余的结果和不取余结果一致)
20分钟速成排序+查找算法(含模板)——二分查找,冒泡排序,快速排序http://t.csdnimg.cn/PMNmc
蓝桥杯必备模板(python蓝桥杯)http://t.csdnimg.cn/B3aYf
统计器 Counter
from collections import Counter
cnt = Counter()
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
cnt[word] += 1
print(cnt) # Counter({'blue': 3, 'red': 2, 'green': 1})
import re
words = re.findall(r'\w+', open('11.txt').read().lower())
print(Counter(words).most_common(10))
'''
[('the', 1143), ('and', 966), ('to', 762), ('of', 669), ('i', 631),
('you', 554), ('a', 546), ('my', 514), ('hamlet', 471), ('in', 451)]
'''
判断闰年 calendar
import calendar
print(calendar.isleap(2000)) # True
print(calendar.isleap(2100)) # False
算法总纲
算法基础
语法基础
变量、运算、输入输出、函数、结构体/类、内置库函数API
语法进阶
时间复杂度分析、枚举、模拟、递归、进制转换
基础算法(高)
倍增、构造、位算法、前缀和、差分、离散化、贪心、双指针、二分
排序(低)
冒泡排序、选择排序、插入排序、快速排序、归并排序、桶排序
搜索(高)
DFS基础、回溯、剪枝、记忆化、折半搜索
基础数据结构(中)
链表、栈、队列、堆、st表、树、树的基本概念、树的遍历、树的直径和重心
图论基础(低)
图的基本概念、图的遍历、拓朴排序
动态规划基础(高)
动态规划基础、线性dp模型
背包问题(低)
01背包、完全背包、多重背包、基础、二进制优化、单调队列优化、混合背包、二维费用背包、分组背包、属性依赖背包
动态规划进阶(中)
树形dp、区间dp、状压dp、数位dp、期望dp
字符串匹配算法(低)
KMP、Manacher、字符串hash、字典树、最小表示法
数论基础(高)
GCD、LCM、快速幂、矩阵快速幂、高斯消元、素数筛、唯一分解定理、约束定理、反素数
图论算法和理论(低)
最短路、floyd、SPFA、Dijkstra、最小生成树、Kruskal、Prim、图的连通、强连通分量、割点
算法提高
数论进阶(中)
费马小定理、欧拉定理、欧拉函数、欧拉降幂、威尔逊定理、中国剩余定理、扩展中国剩余定理、斐蜀定理、康托定理、康托展开、线性基、整除方块
排列组合(低)
排列组合基础、lucas定理
树形数据结构(中)
LCA、DFS序、树状数组、线段树、主席树、平衡树、Dsu On Tree
计算几何基础(中)
叉积的应用、点和线段的关系、点和直线的关系、点到直线的距离、点到线段的距离、线段相交判断、直线相关判断、线段上整点数
高级数据结构(中)
单调数据结构、单调栈、单调队列、二维单调队列、并查集、路径压缩、按秩合并、种类并查集、可持久化并查集、带权并查集、分块基础、莫队算法
图论高阶应用(低)
二分图判定、二分图最大匹配、二分图最大权匹配
动态规划优化(低)
斜率优化、四边形不等式优化、数据结构优化
博弈论(低)
尼姆博弈、反尼姆博弈、nim-K博弈、SG函数
算法进阶
建议深入理解和掌握以下几个方面,以提升解题能力和应对更复杂的挑战:
1. 动态规划高级技巧:
- 状态压缩DP:
在状态数目巨大时,使用位操作或其它编码方式减少状态空间。 - 优化DP转移:熟练掌握斜率优化、单调队列优化、四边形不等式等高级优化技巧,以降低时间复杂度。
- 空间优化:了解滚动数组、原地修改等技巧来减少空间消耗。
2. 图论高级主题:
- 网络流:包括最大流(如 Dinic 算法、Edmonds-Karp 算法)、最小割理论及其应用(如二分图匹配的KM算法)。
- 树的高级算法:如树链剖分、重链剖分,以及它们在各种问题中的应用。
- 图的染色与划分:理解并能应用图的着色问题、点覆盖、边覆盖等。
3. 数学与数论:
- 组合数学高级内容:学习并能够灵活运用生成函数、Polya 定理、容斥原理等解决复杂计数问题。
- 数论高级技巧:深入理解模线性方程组、同余方程、Pollard rho 算法等,在大整数问题中寻找解。
4. 计算几何:
- 高级几何算法:凸包问题、旋转卡壳法、扫描线算法等,以及如何高效处理多边形、点集问题。
5. 字符串处理高级技术:
- 后缀数组:用于解决最长公共子串、模式匹配等问题的高效数据结构。
- AC自动机:快速实现多模式字符串匹配。
6. 高级数据结构:
- Treap、Splay Tree、Fenwick Tree(Binary Indexed Tree 的别称)等,以及这些数据结构在特定问题中的高效应用。
- 在线算法与数据流:如Count-Min Sketch、Bloom Filter等,适用于大数据量下的近似计算和查询。
7. 算法设计策略:
- 分治法、贪心策略、概率算法等高级设计思路,以及如何结合多种方法解决综合问题。
8. 编程实践与调试能力:
- 提高代码质量,注重边界条件处理,学习调试技巧,提升问题定位和修正错误的速度。
9. 算法竞赛思维:
- 思维训练:通过大量练习,培养对问题的敏锐洞察力,快速识别问题类型和适用算法。
- 压力测试:学会编写和使用压力测试程序,验证算法的正确性和性能极限。