写在前面:
本系列博客仅作为本人十一假期过于无聊的产物,对小学期的程序设计作业进行一个总结式的回顾,如果将来有BIT的学弟学妹们在百度搜思路时翻到了这一条博客,也希望它能对你产生一点帮助(当然,依经验来看,每年的题目也会有些许的不同,所以不能保证每一题都覆盖到,还请见谅)。
不过本人由于学艺不精,代码定有许多不足之处,欢迎各位一同来探讨。
同时请未来浏览这条博客的学弟学妹们注意,对于我给出完整代码的这些题,仅作帮助大家理解思路所用(当然,因为懒,所以大部分题我都只给一个伪代码)。Anyway,请勿直接复制黏贴代码,小学期的作业也是要查重的,一旦被查到代码重复会严厉扣分,最好的方法是浏览一遍代码并且掌握相关的要领后自己手打一遍,同时也要做好总结和回顾的工作,这样才能高效地提升自己的代码水平。
加油!
写在写在前面的后面:
当你们搜到这个系列博客的时候,或许你正抓耳挠腮于DFS(T2.解谜游戏)、或许你正纠结于UTF-8编码的读入和输出(T7.一夜发白《千字文》)、抑或许你正百思不得其解自己TLE的原因究竟何在(好多好多题),不必失落、不必沮丧,因为很多人都是这么一路路走过来的(非常非常强的大佬们除外),这都是学习算法的必经之路。你所要做的,就是记住自己踩的这么一个个坑,了解这些坑的构造,掌握跳过这些坑的方法,所有的绊脚石就终将成为你的垫脚石。
但切记,不要直接c+v抄代码,这样完成的作业是完全无效的,就只是骗自己而已。遇到自己看完所有人写的思路都实在没有办法搞明白的题目,也只能去“读”别人的代码,读懂之后再自己复写一遍,再试着从自己写出来的代码中归纳出同类型题目的特点和解题通法,这才是真正“掌握”了这道题。
同时建议各位,不要压着ddl写程设的作业,程设的作业往往是需要靠时间磨出来的,自己研究一个下午终于看到一片AC的喜悦,远远高于看完别人的题解然后“一知半解”地“秒杀”题目的喜悦,更远远大于直接cv别人作业获得一片绿的喜悦。
如何从《程序设计基础》到《程序设计实践》:
BIT的课程设置是这样,大一下学完程序设计基础之后,马上到大二上的程序设计实践,但实际上二者的跨度非常之大,程序设计实践涉及到的各种算法、数据结构都是程序设计基础这门课不曾涉及或者仅仅浅尝辄止的,同时程序设计基础这门课是基于C语言的,很多有关C++的特性都没有作翔实的介绍,所以很多同学要么是全程用C语言坚持下来(当然,用C语言通关程序设计实践的同学也有,但难度确实更大),要么一知半解地使用着C++。前者这样会遇到的问题是,很多没有系统学习过的算法和数据结构,自己手动撸代码会出现各种各样的问题(比如优先队列的实现、快排的实现),在这门课程中我推荐各位先使用C++自带的STL库来完成这些事情,等到之后的《算法与数据结构》这门课,再详细地理解这其中的底层构造(当然,对自己要求更高的大佬肯定不满足于此,那直接一步到位也是没问题的);后者则容易囫囵吞枣,例如memset的用法,很多学生看到别人memset初始化为0了之后自然而然地认为memset可以初始化为任何自己想要的数,这就是对于知识点的错误理解。基于以上两点,我认为,对于大部分没有过竞赛经验的人来说,在正式进入《程序设计实践》这门课的时候,需要做一些先期的准备。
同时我认为,BIT之所以把程序设计实践这门课放在小学期,也有一部分原因是要锻炼大家的自学能力(毕竟小学期的课程密度还是挺小的,留给学生自由分配的时间非常的充裕)。
在此列出一些大家可能需要学习的算法、数据结构、基本的编程知识和个人学习过程中感觉不错的资源:(持续更新)
- 基础知识篇
- C++内存分配方式详解_Mr.Phoebe的专栏-CSDN博客
- C++中引用(&)的用法和应用实例 - 哦摩西罗伊 - 博客园
- C++ 类 & 对象 | 菜鸟教程
- C++ 命名空间 | 菜鸟教程
- C++ 文件和流 | 菜鸟教程
- C++ STL 教程 | 菜鸟教程 (建议购买一本C++标准程序库随时参阅)
- memset()相关使用_xuyin1204的博客-CSDN博客
- 深入解析new、operator new、::new、placement new_Likes的博客-CSDN博客
- 算法篇
- 字符串的常见处理方法(KMP方法、BM方法、Sunday方法等)
参考资料:
I. 【入门5】字符串 - 题单 - 洛谷
II. KMP,BM,Sunday算法详解_白雪少年-CSDN博客
- 数组的常见处理方法(分治、滑动窗口、双指针、前缀和、差分等)
I. 力扣-数组和字符串
力扣-滑动窗口和双指针(需要力扣会员)
力扣-数组类算法
II. 【算法2-1】前缀和与差分 - 题单 - 洛谷
III.我写了首诗,把滑动窗口算法算法变成了默写题 :: labuladong的算法小抄
- 贪心算法(简单贪心、局部贪心、反悔性贪心)
参考资料:
I. 【算法1-5】贪心 - 题单 - 洛谷
II. 力扣-贪心算法(需要力扣会员)
- 排序算法(冒选插归谢快归计桶基)
参考资料:
I. 1.0 十大经典排序算法 | 菜鸟教程
II.力扣-排序算法全解析(需要力扣会员)
- 搜索和查找算法(BFS、DFS,以及数据结构中的BST搜索树、AVL平衡树、哈希表)
参考资料:
I. 【算法1-6】二分查找与二分答案 - 题单 - 洛谷
【算法1-7】搜索 - 题单 - 洛谷
II. 力扣-深度优先搜索
力扣-广度优先搜索(需要力扣会员)
力扣-二分查找
III. 我写了首诗,让你闭着眼睛也能写对二分搜索 :: labuladong的算法小抄
BFS 算法解题套路框架 :: labuladong的算法小抄
- 动态规划(单串、双串、矩阵、前缀和、状态压缩)
参考资料:
I. 力扣-动态规划精讲(需要力扣会员)
II. 背包九讲——全篇详细理解与代码实现_良月澪二的博客-CSDN博客_背包九讲
III. 动态规划解题套路框架 :: labuladong的算法小抄
第二章、手把手刷动态规划 :: labuladong的算法小抄
- 位运算和数学
参考资料:
I. 位运算(&、|、^、~、>>、 | 菜鸟教程
II. 位运算有什么奇技淫巧? - 知乎
- 数据结构篇
- 队列(单端队列、双端队列)
- 栈(出栈序列、单调栈)
- 树(二叉树、BST搜索树、AVL平衡树、红黑树等)
- 哈希表(哈希函数、完美哈希函数、冲突解决)
- 堆(大小根堆、对顶堆、TOP K、The Kth)
- 链表(双向链表、循环链表等)
- 图(邻接矩阵、邻接表、DFS、BFS、Prim算法、Kruskal算法、Dijkstra算法、Floyd算法等)
- 有用的资源
- 《C++标准程序库》Nicolai M·Josuttis 华中科技大学出版社
- 《C++程序设计》梁勇 机械工业出版社
- 《大话数据结构》程杰 清华大学出版社
- 菜鸟教程 - 学的不仅是技术,更是梦想!
- 力扣
- 首页 - 洛谷 | 计算机科学教育新生态
- Reference - C++ Reference (全英文警告)
- 开篇词 - labuladong 的算法小抄
当然!以上列出这么多东西,第一他只是我个人主观认识下的产物,学习顺序也并非完全如上面所示,仅给各位需要的同学作一点参考;第二,在短时间内完全吸收这么多东西也是不可能的,大家多根据自己的需要选择性地吸收知识,争取在有限的时间内最大化自己的学习成果。
后续我会陆续更新程序设计实践小学期的三十道编程作业(给自己挖个大坑,争取不弃坑),当然,看到这个帖子的同学们估计已经是一年后两年后乃至很多年后在上大二小学期的同学了(北理的题基本不变的,笑),如果能对你们有所帮助的话,也可以留个言让我看见呀!