模拟卷二分析

  • 单项选择目标分数:26 及其以上,现分数 20 分
  • 阅读程序目标分数:30 及其以上,现在分数 20.5 分

单项选择题错误均在简单题目上,如计算机历史的考察,如位运算等。

阅读程序失分点在计算量不够,计算方法不正确。

单项选择查漏补缺

第一题关于字符串的知识点补充:双引号括起来的字符串,末尾会自动追加 \0,其作用是表示停止。

所以这里要区分所占内存空间和字符串长度之间的关系,使用 strlen 求解的是字符串长度,不计算 '\0`,但是计算字符串所占内存空间要计算进去。

(必考)三码转换

习惯上我们以 8 位二进制来表示一个整数,如果不够,考虑使用 16 位。

对于正数来说,三码相同,就等于其二进制表示。

例如 (+5)10(0000101)2(+5)_{10} \rightarrow (0000101)_2,那么反码,补码均和这个二进制相同。

对于负数来说,就要手动计算,要注意最高位要为 1,表示它是一个负数。

原码就等于其绝对值的二进制表示,最高位置为 1。

例如 (5)10(10000101)2(-5)_{10} \rightarrow (10000101)_2,那么原码就得到了。

反码的求法:原码的最高位不动,其余位置按位取反,即 01,100 \rightarrow 1, 1 \rightarrow 0

补码的求法:反码 + 1,依次进位,如果超出最高位,截断。

(必考)位运算

位运算常用的符号有:&, |, ^, <<, >>

按位与和或,都是和逻辑与逻辑或完全一致的运算规则。

按位异或 ^:同零异一。

所以根据异或的计算规则,可以得到这么一个使用技巧:如果两个数相同,那么异或之后一定为 0.

if ((x ^ y) == 0)

反思

我对以前的知识点掌握的不够熟练:

  1. 原码、补码、反码
  2. 进制转换
  3. 位运算(|、&、^)
  4. 计算机的历史

对于在二选一的题目(有可能是对的和绝对是对的)选绝对是对的。

阅读程序查漏补缺

问题:

  • 草稿纸使用不规范,一定要清晰的保留中间的计算结果(思路),方便后面检查,减少检查时候的计算量
  • 做题方法凭感觉来,没有章程,那么简单题会出现所谓的失手(粗心),难题就不会做,没有分析的方式方法

做题流程:

  • 通读程序,通过程序给定的函数进行功能的划分,把能看懂的部分先看懂,看不懂的先打个问号大概猜一下作用(这一部分有时候可以通过整体来反推局部功能)
  • 边做题,边总结这个程序是做什么的,我们要通过计算来去反推程序的功能、结论、性质

第一道阅读程序

17题错误:本人供是粗心

实际不是,实际是没有对程序的功能进行一个总结,即没有总结 clzcmp 函数。

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之类的问题,应该在草稿纸上画出对应的表格 ,通读题目并在卷面上标注以下信息:

  1. 关于数组,要去检查范围大小,检查起点是0还是1
  2. 看数据的范围
  3. 对看懂的函数,进行简要的解释