- huanghaoran 的博客
CSPJ 初赛学习第二天
- @ 2026-7-7 10:18:19
模拟卷二分析
- 单项选择目标分数:26 及其以上,现分数 20 分
- 阅读程序目标分数:30 及其以上,现在分数 20.5 分
单项选择题错误均在简单题目上,如计算机历史的考察,如位运算等。
阅读程序失分点在计算量不够,计算方法不正确。
单项选择查漏补缺
第一题关于字符串的知识点补充:双引号括起来的字符串,末尾会自动追加 \0,其作用是表示停止。
所以这里要区分所占内存空间和字符串长度之间的关系,使用 strlen 求解的是字符串长度,不计算 '\0`,但是计算字符串所占内存空间要计算进去。
(必考)三码转换
习惯上我们以 8 位二进制来表示一个整数,如果不够,考虑使用 16 位。
对于正数来说,三码相同,就等于其二进制表示。
例如 ,那么反码,补码均和这个二进制相同。
对于负数来说,就要手动计算,要注意最高位要为 1,表示它是一个负数。
原码就等于其绝对值的二进制表示,最高位置为 1。
例如 ,那么原码就得到了。
反码的求法:原码的最高位不动,其余位置按位取反,即
补码的求法:反码 + 1,依次进位,如果超出最高位,截断。
(必考)位运算
位运算常用的符号有:&, |, ^, <<, >>
按位与和或,都是和逻辑与逻辑或完全一致的运算规则。
按位异或 ^:同零异一。
所以根据异或的计算规则,可以得到这么一个使用技巧:如果两个数相同,那么异或之后一定为 0.
if ((x ^ y) == 0)
反思
我对以前的知识点掌握的不够熟练:
- 原码、补码、反码
- 进制转换
- 位运算(|、&、^)
- 计算机的历史
对于在二选一的题目(有可能是对的和绝对是对的)选绝对是对的。
阅读程序查漏补缺
问题:
- 草稿纸使用不规范,一定要清晰的保留中间的计算结果(思路),方便后面检查,减少检查时候的计算量
- 做题方法凭感觉来,没有章程,那么简单题会出现所谓的失手(粗心),难题就不会做,没有分析的方式方法
做题流程:
- 通读程序,通过程序给定的函数进行功能的划分,把能看懂的部分先看懂,看不懂的先打个问号大概猜一下作用(这一部分有时候可以通过整体来反推局部功能)
- 边做题,边总结这个程序是做什么的,我们要通过计算来去反推程序的功能、结论、性质
第一道阅读程序
17题错误:本人供是粗心
实际不是,实际是没有对程序的功能进行一个总结,即没有总结 clz 和 cmp 函数。
cmp 函数总结:先按照 clz 返回值大小排序,如果 clz 返回值大小相同,按照原来的数字升序排序。
此处不一定要求知道 clz 的作用,我们只是知道排序的规则。
再去计算/研究 clz 的结论,就是前导 0 的个数 / 首位 1 的位置。
反省
本大题一定是要么全对,要么错的七七八八,不存在中间粗心的可能性。
例如 17 题的错误,完全可以交由 20 题来解决,20 题已经给出了程序的功能。
如何杜绝?检查,做完之后完整的过一遍,看看有哪些题目是可以上下文相互呼应的。
关于位运算阅读程序中的技巧
一定要固定 4、8 位来表示一个整数,方便我们去观察出来性质或者说计算结果。
具体用 4 还是 8,取决于最大数字是多少。
第二道阅读程序
主要丢分点:方法不对,纯粹的乱算
题目类型:2 维DP(表格DP)
计算方法:画出相应的表格,上面标记出来转移的路径,去找到规律。
以本题为例,对于 (i,j) 这个格子的转移,会发现只能由上方格子和左边格子进行转移,选择的是二者中较小的一个。
次要丢分点:粗心,完全不通读标注题目信息
以 23 题为例子,根本没注意到/标注题目代码中的 (m+1,n+1) 这个信息,归根到底,是没有通读程序进行标注。
反省
以后遇到表格DP之类的问题,应该在草稿纸上画出对应的表格 ,通读题目并在卷面上标注以下信息:
- 关于数组,要去检查范围大小,检查起点是0还是1
- 看数据的范围
- 对看懂的函数,进行简要的解释