这是一份本人当时备考时总结的复习资料(从202303往前,没有近三次的题目),大致总结了每道题的题型考点、简要的解题思路以及注意事项。希望能对大家的备考有所帮助。
另外,对于第二题来说,主要考察的是基础算法的运用,刷题+总结才是王道,除了真题之外,可以去leetcode上刷对应算法的题目。
我认为比较难的是,在考场上,可能很难短时间内意识到题目对应的算法是哪一个,就算这个算法可能是你已经掌握的,所以还是不能眼高手低,多刷题才是正解。
垦田计划【二分】
- 二分答案
- 怎么判断可以用二分做呢?
- 贪心:相同天数的一起处理,从大往小
训练计划【小模拟】
-
DFS
-
训练计划构成一棵树。最早开始时间从根往叶子递推。最迟开始时间从从叶子往根递推,也就递归求解。
何以包邮? 【背包问题】
- 三种做法
- 求最小值转换成求最大值 sum-x
- 用 01 背包求出 0−S 每一个容量的可达性
寻宝!大冒险!
- 坐标系很大,点很少,不能直接开数组存点,用
PII tree[N]
存储 - 两个坐标系中的点进行匹配
- 在大图中构造出一个小图 再匹配
- 遍历tree中的点,对于在合法范围中的点,判断其是否也在小图中出现,并计数。
- 想用
unordered_set<PII> tree
的count
函数来判断点是否存在,但默认的哈希函数无法处理pair<int, int>
型数据 AcWing 4510. 寻宝!大冒险!(做法大家都会,要开两个优化!!!) - AcWing
【*】出行计划 【差分】再看看差分的题目
-
公式转换,角度转换
-
对于每一个计划,计算应在哪个时间段内做核酸使得该计划能成功通行,让该时间段上的通行数都加一
-
优化思想:求时间点被多少个活动覆盖:差分+前缀和
-
差分题目扩展:101. 最高的牛 - AcWing题库
序列查询新解【枚举、分区间讨论】
- 两个序列,对应位置 绝对值之差 的和
- 根据序列的特点来划分区间计算,使得不需要一对一进行绝对值加减计算
非零段划分【思维题】
- 预处理 山峰
cnt[a[i]] ++
、山谷cnt[a[i]]--
- 前缀和的最大值即为答案
邻域均值【二维前缀和】
-
`if (sum <= t * cnt) res ++ ; // 不能写sum / cnt <= t`
期末预测之最佳阈值【前缀和、双指针】
PII a[N]
存储,排序- 跳过相同的数:
while (q[i].x == q[i + 1].x) i ++ ;
- 前缀和 记录0、1的个数
风险人群筛查【枚举、模拟】
- 无算法层面要求,无复杂度要求
稀疏向量【哈希表(手动模拟-更快/unordered_map-慢
)/ 双指针】
-
注意数据范围 用
longlong
-
像这种数据范围会到
1e9
的,而数据个数1e6
左右的,肯定不能用普通数组来存,要开1e9
个int
,用PII a[N]
存。{index, value}
.
回收站选址【枚举】
- easy 枚举各个点、判断、计数
小明种苹果(续)【小模拟】
- 按题目意思操作即可
表达式求值【模拟】
- 栈stack
【*】小明放学【模拟】【有难度、难想】
- 要点:将倒计时转换为正向时间 并在坐标轴上展开
- 难点:判断当前红绿灯的状态和时间。
买菜【枚举、暴力】
- 求两组区间重合长度
N = 2000
。直接遍历两组区间计算min(a.y, b.y) - max(a.x, b.x)
- 算法基础课:区间合并
碰撞的小球【模拟】
- 存储当前位置与移动方向,结构体/pair存储都行
- 对于每个时刻t,都对小球进行移动操作,并判断是否有碰撞,调整方向
游戏【模拟、队列】
- 队列模拟(先出队,未被筛除掉再入队)
【*】公共钥匙盒3248. 公共钥匙盒 - AcWing题库【模拟】【有点难度!】
-
结构体数组存储每个操作(拿、放),并排序:1.时间顺序 2.先放 > 后拿 3.从小到大的顺序还
-
sort排序函数在结构体上的应用
-
struct Op { int id, type, tm; // 钥匙号、操作类型 放1拿0、时间点 bool operator< (const Op& t) const // 排序:1.时间顺序 2.放 > 拿 3.从小到大的顺序还 { if (tm != t.tm) return tm < t.tm; if (type != t.type) return type > t.type; return id < t.id; } }op[N * 2];
学生排队【小模拟】
- 利用swap函数来一步步交换