编程竞赛需要掌握的知识分几个层次:
- 掌握基本语法,能够把想法转换成代码。因此,需要掌握基本的字符串、数组、输入、输出操作。
- 对于运算量不大的题目,能把问题做出来,做对典型输入。
- 考虑周全,做对全部输入。
- 对于运算量大的题目,要在规定时间内做出来。如果超时,做对也没有用。并且这种题通常很花时间。如果本身已经做不完所有题目,就要有所取舍。不过这种题目的测试数据也是会有简单和复杂之分的,算法比较差也可能得部分分数。
基础语法:
- 字符串:https://oi-wiki.org/lang/python/#%E5%AD%97%E7%AC%A6%E4%B8%B2,https://oi-wiki.org/lang/python/#%E8%BE%93%E5%85%A5%E8%BE%93%E5%87%BA
- 数组:https://oi-wiki.org/lang/python/#%E4%BD%BF%E7%94%A8-list
几种基本算法(了解一些常见思想,除递归外,一般不学也可以自己想出来):
- 枚举算法:https://oi-wiki.org/basic/enumerate/
- 模拟算法:https://oi-wiki.org/basic/simulate/
- 递归算法(重点):https://oi-wiki.org/basic/divide-and-conquer/
- 二分算法:https://oi-wiki.org/basic/binary/
- 贪心算法:https://oi-wiki.org/basic/greedy/
两大解决搜索问题的基础、通用、暴力的算法,重点掌握:
数论相关知识:
- 欧几里得算法(求最大公约数,有直接函数可调用math.gcd):https://cto.eguidedog.net/node/1503
- 素数表的埃氏筛法和线性筛法:https://oi-wiki.org/math/number-theory/sieve/#__tabbed_1_2
- 唯一分解定理:https://cto.eguidedog.net/node/1505
下面一些数据结构需要了解概念,感兴趣可以深入理解:
- 单链表、双链表、循环链表:https://oi-wiki.org/ds/linked-list/#__tabbed_1_2
- 栈:https://oi-wiki.org/ds/stack/
- 队列、循环队列:https://oi-wiki.org/ds/queue/
树的定义,构造与遍历(需要搞清楚“前序遍历、中序遍历、后序遍历”这个概念,不然对涉及这个知识点的题连题目都搞不明白很吃亏):https://www.w3school.com.cn/python/python_dsa_trees.asp 、 https://www.w3school.com.cn/python/python_dsa_binarytrees.asp - 哈夫曼树、哈夫曼编码:https://oi-wiki.org/ds/huffman-tree/
- 完全二叉树:深度为 h:前 \(h-1\) 层全部填满;第 h 层节点靠左连续放,中间不能有空洞抖音百科 一句话:把节点按层序从上到下、从左到右编号,不能断号。 满二叉树是特殊的完全二叉树。
- 二叉排序树(又叫二叉搜索树):https://oi-wiki.org/ds/bst/
格雷编码:https://oi-wiki.org/math/numeral-sys/gray-code/
递归、深度/广度优先搜索、二叉树是紧密关联的,搜索算法可能用到递归来实现,二叉树的遍历需要使用搜索算法。二叉树的结构扩展一下就是图。图论里有很多知识和实际应用密切相关。
一些不够时间就不要看的内容:
- 递推算法(很多数学公式,你可能会喜欢,我看着头皮发麻):https://oi-wiki.org/math/poly/linear-recurrence/
- 动态规划(这部分内容多也比较难,时间有限建议放弃):https://oi-wiki.org/dp/
- 排序算法(内容太多,又太基础,学习时间长,直接考的概率低,只建议在时间非常多的时候打基础):https://oi-wiki.org/basic/sort-intro/
OI Wiki上面有很多知识点,也涉及很多数学知识,它可以给你带来启发,可能可以用在玩转数学上的一些思路: https://oi-wiki.org
评论