CCF-CSP认证备考 第二题 历年解题思路汇总

本文总结了CCF-CSP考试的历年真题,重点介绍了题型分类,如二分、贪心、DFS等算法的应用,以及背包问题、稀疏向量等难题的解题方法。备考建议强调刷题和总结,同时分享了解题技巧和优化思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是一份本人当时备考时总结的复习资料(从202303往前,没有近三次的题目),大致总结了每道题的题型考点、简要的解题思路以及注意事项。希望能对大家的备考有所帮助。

另外,对于第二题来说,主要考察的是基础算法的运用,刷题+总结才是王道,除了真题之外,可以去leetcode上刷对应算法的题目。

我认为比较难的是,在考场上,可能很难短时间内意识到题目对应的算法是哪一个,就算这个算法可能是你已经掌握的,所以还是不能眼高手低,多刷题才是正解。

CCF-CSP考试历年真题题型分类 - AcWing

垦田计划【二分】

  • 二分答案
  • 怎么判断可以用二分做呢?
  • 贪心:相同天数的一起处理,从大往小

训练计划【小模拟】

  • DFS

  • 训练计划构成一棵树。最早开始时间从根往叶子递推。最迟开始时间从从叶子往根递推,也就递归求解。

何以包邮? 【背包问题

  • 三种做法
  • 求最小值转换成求最大值 sum-x
  • 用 01 背包求出 0−S 每一个容量的可达性

寻宝!大冒险!

  • 坐标系很大,点很少,不能直接开数组存点,用 PII tree[N]存储
  • 两个坐标系中的点进行匹配
    • 在大图中构造出一个小图 再匹配
    • 遍历tree中的点,对于在合法范围中的点,判断其是否也在小图中出现,并计数。
  • 想用unordered_set<PII> treecount函数来判断点是否存在,但默认的哈希函数无法处理 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

  • 题解 AcWing 3288. 稀疏向量 - AcWing

  • 像这种数据范围会到1e9的,而数据个数1e6左右的,肯定不能用普通数组来存,要开1e9int,用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函数来一步步交换
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值