Login to join training plan
先来点真实的
无赖流算法修炼指南:从新手村出发,边学边练,一路上分!
玩法与目的
把这份题单当成一场闯关游戏:按关卡顺序学习,逐步解锁新的算法,再通过练习把它们变成自己的技能。
每一关的目标是:能够独立写出代码,讲清楚解题思路,并处理好边界情况。
最终奖励:知识、经验,以及越来越少的报错(确信)。
关于训练题单
新手村
新手村主要是基础语法题,帮助大家熟悉输入输出、变量与数据类型、条件判断、循环、数组和字符串。
通过这一关,你需要能够把简单的题意转化为代码,并养成检查输入范围、用小样例验证结果的习惯。
展露头角
这一关会在基础语法之上增加一些思考。你将继续夯实语法,并接触以下解题方法:
- 模拟:按照题目给出的规则,一步步还原过程,注意执行顺序和状态变化。
- 暴力枚举:在数据范围允许的情况下,枚举所有可能的方案,逐一判断是否满足要求。
- 递归:把问题拆成规模更小的同类问题,明确递归如何推进,以及什么时候结束。
从这一关开始,做题时要关注数据范围和时间复杂度,判断自己的方法能否在规定时间内运行。
势如破竹
这一关需要解锁两项常用技能:排序算法和贪心算法。
1. 排序算法
先学习冒泡排序、选择排序和插入排序,理解比较、交换和移动元素的过程。
再学习快速排序和归并排序,理解它们的分治思想,尽量做到能够手写实现,并了解不同排序算法的时间复杂度和稳定性。
随后熟悉语言提供的排序工具,例如 C 的 qsort、C++ 的 std::sort,并练习自定义排序规则。
学习链接:十大经典排序算法(动图演示)|博客园 https://www.cnblogs.com/onepixel/articles/7674659.html
2. 贪心算法
贪心算法的核心是:每一步都按照某种规则,选择当前看来最优的方案。
局部最优不一定能带来整体最优,因此使用贪心算法时,需要证明所选策略的正确性。
建议从活动安排、区间选择等经典例题入手,理解如何设计贪心策略,再学习交换论证等证明方法。学习的重点是:确定每一步的选择规则,并说明为什么这样选能得到整体最优解。
学习链接1:贪心算法|OI Wiki https://oi-wiki.org/basic/greedy/
学习链接2:从零开始学贪心算法|CSDN https://blog.csdn.net/qq_32400847/article/details/51336300
名震一方
这一关的主角是二分算法。它代码简短、应用灵活,是算法题中非常常用的一项技能。
建议先掌握有序序列中的二分查找,再学习利用可行性判断进行的“答案二分”。使用时,重点关注三个问题:
- 单调性:二分查找要求序列有序;答案二分要求候选答案的可行性具有单调性,例如随着答案增大,判断结果从“不满足”变为“满足”,且不会再变回去。
- 判断条件:明确
check(x)判断的是什么,以及判断结果对应哪一侧搜索区间。 - 边界与收敛:明确左右端点的含义,保证每次更新都能缩小搜索区间,避免越界和死循环。
写完后,用重复元素、答案位于端点、找不到目标等情况检查代码。练习时,尝试解释每一次边界更新的理由,逐步掌握二分的思路。
博客链接1:2021年 SWPUACM 暑假集训 day1:二分算法|CSDN https://acmer.blog.csdn.net/article/details/118559948
博客链接2:递增整数序列的二分详解|博客园 https://www.cnblogs.com/qswg/p/6251887.html
视频链接:二分算法讲解(共两集)|哔哩哔哩 https://www.bilibili.com/video/BV1T44y1q7nL
Section 2. 展露头角
Invalid
This section cannot be challenged at present, so please complete the following sections first:
- Section 1. 新手村 (Completed 0%)
| Problem | Tried | AC | Difficulty |
|---|---|---|---|
| P1173 A.我只知道,在我心里,比起这个世界,你更重要! | 1337 | 163 | 8 |
| P1174 B.为世界上所有的美好而战 | 366 | 166 | 4 |
| P1175 C.今天也全力以赴,守护着世界 | 671 | 149 | 3 |
| P1041 全排列 | 393 | 149 | 5 |
| P1031 回文数 | 523 | 208 | 5 |
| P1044 输出不定方程解的个数 | 436 | 165 | 5 |
| P1045 上台阶 | 684 | 169 | 7 |
| P1062 加法 | 884 | 124 | 8 |
| P1075 约瑟夫的杀人计划 | 380 | 113 | 6 |
| P1082 矩阵交换行 | 309 | 137 | 4 |
| P1083 数字金字塔 | 280 | 108 | 5 |
| P1021 素食主义 | 791 | 116 | 8 |
| P1023 拯救公主? | 362 | 114 | 6 |
| P1028 A + B 与繁星 | 241 | 103 | 4 |
| P1102 D.整数分解 | 620 | 193 | 6 |
| P1085 矩阵乘法 | 389 | 82 | 7 |
| P1111 Ball Dropping | 164 | 76 | 4 |
| P1112 Determine the Photo Position | 242 | 65 | 7 |
Section 3. 势如破竹
Invalid
This section cannot be challenged at present, so please complete the following sections first:
- Section 1. 新手村 (Completed 0%)
- Section 2. 展露头角 (Completed 0%)
| Problem | Tried | AC | Difficulty |
|---|---|---|---|
| P1105 排序 | 350 | 91 | 7 |
| P1106 SYZOJ算法大赛成绩排序 | 242 | 90 | 5 |
| P1024 僵尸水族馆 | 319 | 74 | 7 |
| P1072 排队打水 | 305 | 94 | 6 |
| P1087 「一本通 1.1 例 1」活动安排 | 220 | 67 | 6 |
| P1090 「一本通 1.1 例 5」智力大冲浪 | 107 | 57 | 3 |
| P1091 「一本通 1.1 练习 1」数列极差 | 163 | 59 | 5 |
| P1092 「一本通 1.1 练习 3」线段 | 157 | 49 | 6 |
| P1073 砸金蛋 | 350 | 52 | 8 |
| P1107 NOIP2002A均分纸牌 | 122 | 55 | 4 |
| P1108 街上的树 | 213 | 47 | 7 |
| P1109 Dividing a String | 138 | 40 | 6 |
Section 4. 名震一方
Invalid
This section cannot be challenged at present, so please complete the following sections first:
- Section 1. 新手村 (Completed 0%)
- Section 2. 展露头角 (Completed 0%)
- Section 3. 势如破竹 (Completed 0%)
| Problem | Tried | AC | Difficulty |
|---|---|---|---|
| P1117 二分查找 | 472 | 61 | 8 |
| P1156 「一本通 1.2 例 1」愤怒的牛 | 116 | 28 | 7 |
| P1172 「NOIP2015」跳石头 | 246 | 50 | 4 |
| P1157 「一本通 1.2 例 2」Best Cow Fences | 43 | 13 | 6 |
| P1158 「一本通 1.2 练习 1」数列分段 II | 113 | 17 | 8 |
| P1159 「一本通 1.2 练习 2」扩散 | 59 | 17 | 6 |
| P1153 「LibreOJ β Round」ZQC 的拼图 | 3 | 3 | 10 |
| P1155 「LibreOJ β Round #5」最小倍数 | 36 | 3 | 9 |
- Enrollees
- 728
- Created By