CSP 复习

在这里插入图片描述

这是什么意思阿

普及提高都可以看的

以下知识点仅限前 15 15 15 道选择题

那么简单,也不一定完整,恐怕没人看吧

如果有误,还请指出,感谢!

下面知识点是超级重要的(个人观点)

1. 单位转化

计算机中常用的有 6 6 6 个内存单位,下面是单位换算的公式:

8   b i t = 1 B 8\ \mathtt{bit}=1\mathtt{B} 8 bit=1B

1024   B = 1024   K B 1024\ \mathtt{B}=1024\ \mathtt{KB} 1024 B=1024 KB

1024   K B = 1   M B 1024\ \mathtt{KB}=1\ \mathtt{MB} 1024 KB=1 MB

1024   M B = 1   G B 1024\ \mathtt{MB}=1\ \mathtt{GB} 1024 MB=1 GB

1024   G B = 1   T B 1024\ \mathtt{GB}=1\ \mathtt{TB} 1024 GB=1 TB

例题:

一个 32 32 32 位整型变量占用()个字节。

A. 32

B. 128

C. 4

D. 8

CSP 2019 入门级第一轮第 1 1 1

套公式: 32 ÷ 8 = 4   B 32\div8=4\ \mathtt{B} 32÷8=4 B ,选 C \mathtt{C} C

2. 一些名人

回去一定要回去给他们磕个头烧个香

  1. 艾伦·麦席森·图灵,英国人,计算机科学/人工智能之父首次提出了计算机科学理论
  2. 冯·诺依曼,美国人,现代计算机之父首次提出了存储程序控制原理
  3. 克劳德·香农,美国人,提出了某种信息从一处传送到另一处所需的全部设备所构成的系统, 创造了信息论
  4. Ada·Lovelace,第一位程序员/软件设计工程师

来看例题:

以下奖项与计算机领域最相关的是( )。

A. 奥斯卡奖

B. 图灵奖

C. 诺贝尔奖

D. 普利策奖

CSP 2021 入门级第一轮第 2 2 2

死记硬背的知识,选 B \mathtt{B} B

1948 年,( )将热力学中的熵引入信息通信领域,标志着信息论研究的开端。

A. 欧拉(Leonhard Euler)

B. 冯·诺伊曼(John von Neumann)

C. 克劳德·香农(Claude Shannon)

D. 图灵(Alan Turing)

CSP 2020 提高级第一轮第 15 15 15

死记硬背的知识,选 C \mathtt{C} C

3. 计算机语言常识

机器语言/机器码:最早的语言,计算机唯一能识别的语言由二进制数字 1 and ⁡ 0 1\operatorname{and}0 1and0 组成,速度快,难度高。

汇编语言:用符号代替二进制数,计算机不能直接识别,需要用编译器进行编译,难度依然很大,目前除了对性能要求极高外不被使用。

高级语言:如今的编程语言(C++,JAVA等),需要用编译器,难度小,分为编译方式和解释方式两种编译方式。

编译方式(C++):先对整个程序进行编译(会进行多次分析),再执行程序。速度快(进行多次编译对程序进行优化)。

解释方式(Python/PHP):扫描一行解释一行,速度慢(无法进行优化)。

面向对象的语言有: Smalltalk,Eiffel,C++,Java,PHP,Python等

剩下的语言我也不知道面向个啥?

例题:

以下不属于面向对象程序设计语言的是( )。

A. C++

B. Python

C. Java

D. C

CSP 2021 入门级第一轮第 1 1 1

死记硬背的知识,选 D \mathtt{D} D

4. 原码,反码,补码

计算机中要处理的整数有无符号有符号之分,无符号整数顾名思义就是不考虑正负的整数,可以直接用二进制表示

这里只讨论有符号整数。

原码:原码将一个整数表示成符号位+二进制串。符号位上, 0 0 0 表示正数, 1 1 1 表示负数。

但是呢,只用原码的话,进行两个异号数相加或两个同号数相减时很不方便,而且, 0 0 0 的表示不唯一(可以表示为 00000000 00000000 00000000 10000000 10000000 10000000

所以,引入反码和补码的概念

反码:对于一个正数反码就是其原码;对于一个负数反码就是除符号位外,原码的各位全部取反

补码:对于一个正数补码就是其原码;对于一个负数补码等于反码 + 1 +1 +1

举个例子:

5 5 5 的原码,反码和补码都一样,为 0101 0101 0101

然而, − 5 -5 5 的原码为 1101 1101 1101 ,其反码为 1010 1010 1010 ,补码为 1011 1011 1011

我们一般用原码表示正数,用补码表示负数

例题:

十进制数 114 114 114 的相反数的 8 8 8 位二进制补码是:

A. 10001110

B. 10001101

C. 01110010

D. 01110011

CSP 2020 第一轮(初赛)模拟第 1 1 1

首先,我们要求出 114 114 114 的相反数,即 − 114 -114 114 的原码,这与进制知识相关

先求 114 114 114 的原码

114 ÷ 2 = 57 ⋯ 0 57 ÷ 2 = 28 ⋯ 1 28 ÷ 2 = 14 ⋯ 0 14 ÷ 2 = 7 ⋯ 0 7 ÷ 2 = 3 ⋯ 1 3 ÷ 2 = 1 ⋯ 1 1 ÷ 2 = 0 ⋯ 1 \begin{aligned}&114\div2=57\cdots0\\&57\div2=28\cdots1\\&28\div2=14\cdots0\\&14\div2=7\cdots0\\&7\div2=3\cdots1\\&3\div2=1\cdots1\\&1\div2=0\cdots1\end{aligned} 114÷2=57057÷2=28128÷2=14014÷2=707÷2=313÷2=111÷2=01

得到其原码为 1110010 1110010 1110010 ,但是要用 8 8 8 位二进制表示 − 114 -114 114 ,那么,其结果为 11110010 11110010 11110010

接下来,得到其反码: 10001101 10001101 10001101

最后,得到补码: 10001110 10001110 10001110

综上,选 A \mathtt{A} A

5. 数据结构

万恶的数据结构

5.1. 树

树:一个长得像真实生活中倒置(即根在上、叶子在下)的树的图,任意两点之间的简单路径有且只有一条。树是一棵连通且无环的图,边数为 n − 1 n−1 n1

根节点:树最上层的节点,一棵树有且仅有一个。

深度:到根结点的路径上的边数

高度:所有结点深度最大值

叶节点:没有子结点的结点。

父亲:对于除根以外的每个结点,从该结点到根路径上的第二个结点根结点没有父结点

祖先:一个结点到根结点的路径上,除了它本身外的结点根结点的祖先集合为

子节点:如果 u u u v v v 的父亲,那么 v v v u u u 的子结点。子结点的顺序一般不加以区分二叉树是一个例外,有左儿子和右儿子之分。

兄弟:同一个父亲多个子结点互为兄弟

后代:如果 u u u v v v祖先,那么 v v v u u u后代

子树:删掉与父亲相连的边后,该结点所在子图

所以,似乎全是重点

举个例子:

在这里插入图片描述

如图所示, 1 1 1 号结点是根节点, 8 8 8 号节点的深度为 3 3 3,该树高度为 4 4 4 ,叶结点为 4 , 6 , 7 , 8 , 9 , 10 4,6,7,8,9,10 4,6,7,8,9,10

对于 5 5 5 号结点而言,其父亲为 2 2 2 号结点,祖先为 1 , 2 1,2 1,2 号结点, 9 , 10 9,10 9,10 号节点为子结点, 6 , 7 6,7 6,7 号结点为兄弟结点

对于该树而言,其子树有很多,下面为其中一个:

在这里插入图片描述

5.2. 二叉树

树的概念在二叉树中照样适用

下面是遍历相关:

先(前)序遍历:根 → \rightarrow 左儿子 → \rightarrow 右儿子。

中序遍历:左子树 → \rightarrow → \rightarrow 右子树。

后序遍历:左子树 → \rightarrow 右子树 → \rightarrow 根。

另外,如果我们知道了中序遍历以及另外任意一个遍历结果,那么,我们必然会得到一个确定二叉树

下面是特殊的二叉树及其性质:

满二叉树(完美二叉树):所有叶结点的深度均相同的二叉树称为满二叉树(完美二叉树)。

完全二叉树:只有最下面两层结点的度数可以小于 2 2 2,且最下面一层的结点都集中在该层的最左侧

对于一棵满二叉树,其高度为 k k k,则其节点总数为 2 k − 1 2^k-1 2k1此结论可逆

对于一棵满二叉树(完全二叉树),设该节点的编号为 i i i ,则其左儿子的编号(如果有)为 2 × i 2\times i 2×i ,其右儿子的编号(如果有)为 2 × i + 1 2\times i+1 2×i+1此结论可逆

举个例子:

在这里插入图片描述

如上图,这是一个普通的二叉树

在这里插入图片描述

这是一个完全二叉树

在这里插入图片描述

这是一个满二叉树

例题:

如果一棵二叉树只有根结点,那么这棵二叉树高度为 1 1 1。请问高度为 5 5 5 的完全二叉树有 ( )种不同的形态?

A. 16

B. 15

C. 17

D. 32

CSP 2021 入门级第一轮第 8 8 8

注意审题:完全二叉树

因为完全二叉树要求最下面一层的结点都集中在该层的最左侧,所以,无论最后一层有多少个结点,其形态始终只有一个

这里补充一个结论:对于二叉树而言,第 i i i 层的结点数最多为 2 i − 1 2^{i-1} 2i1

那么,第 5 5 5 层的结点数为 2 5 − 1 2^{5-1} 251 ,即 16 16 16 个节点

所以第 5 5 5 层的结点数最少为 1 1 1 个,最多为 16 16 16 个,共 16 16 16 种情况

你也可以暴力枚举

综上,选 A \mathtt{A} A

令根结点的高度为 1 1 1,则一棵含有 2021 2021 2021 个结点的二叉树的高度至少为( )。

A. 10

B. 11

C. 12

D. 2021

CSP 2021 提高级第一轮第 8 8 8

众所周知:对于一棵满二叉树,其高度为 k k k,则其节点总数为 2 k − 1 2^k-1 2k1

分别计算:

当高度为 10 10 10 时,其节点总数最多为 2 10 − 1 2^{10}-1 2101 ,即 1023 1023 1023

当高度为 11 11 11 时,其节点总数最多为 2 11 − 1 2^{11}-1 2111 ,即 2047 2047 2047

当高度为 12 12 12 时,其节点总数最多为 2 12 − 1 2^{12}-1 2121 ,即 4095 4095 4095

题目要求满足条件的最小高度,故选 B \mathtt{B} B

假设一棵二叉树的后序遍历序列为 D G J H E B I F C A \mathtt{DGJHEBIFCA} DGJHEBIFCA,中序遍历序列为 D B G E H J A C I F \mathtt{DBGEHJACIF} DBGEHJACIF,则其前序遍历序列为()。

A. A B C D E F G H I J \mathtt{ABCDEFGHIJ} ABCDEFGHIJ

B. A B D E G H J C F I \mathtt{ABDEGHJCFI} ABDEGHJCFI

C. A B D E G J H C F I \mathtt{ABDEGJHCFI} ABDEGJHCFI

D. A B D E G H J F I C \mathtt{ABDEGHJFIC} ABDEGHJFIC

CSP 2019 入门级第一轮第 14 14 14

考虑后序遍历序列,其最后一个字母为该(子)树的根结点

由于推导过程过大,下面只给出最终的树

在这里插入图片描述

那么,其先序遍历为 A B D E G H J C F I \mathtt{ABDEGHJCFI} ABDEGHJCFI ,答案选 B \mathtt{B} B

6. 进制

6.1. 十进制 n n n m m m 进制

n n n 每次除以 m m m 的余数求出来,然后把余数逆序写出来。

举个例子:

我们要将 17 17 17 转化为二进制数,推导如下:

17 ÷ 2 = 8 ⋯ 1 8 ÷ 2 = 4 ⋯ 0 4 ÷ 2 = 2 ⋯ 0 2 ÷ 2 = 1 ⋯ 0 1 ÷ 2 = 0 ⋯ 1 \begin{aligned}&17\div 2=8\cdots1\\&8\div 2=4\cdots0\\&4\div 2=2\cdots0\\&2\div2=1\cdots0\\&1\div 2=0\cdots1\end{aligned} 17÷2=818÷2=404÷2=202÷2=101÷2=01

逆序写出,得到结果: 10001 10001 10001

6.2. m m m 进制 n n n 转十进制

按位转换,第 i i i 位的数字乘以 m i − 1 m^{i-1} mi1 并累加即可 。

举个例子:

我们要将二进制数 10001 10001 10001 转化成十进制数,推导如下:

( 10001 ) 2 = 1 × 2 4 + 1 × 2 0 = 17 \begin{aligned}(10001)_2 & =1\times2^4+1\times2^0\\ & = 17\end{aligned} (10001)2=1×24+1×20=17

6.3. n n n 进制 k k k m m m 进制

以十进制作为中转,先将 k k k 转为十进制 k 1 k_1 k1,再将 k 1 k_1 k1 转为 m m m 进制。

举个例子:

我们要将二进制数 10001 10001 10001 转化成八进制数,可以先将其转化为十进制数 17 17 17 ,再转化为八进制数 21 21 21

6.4. 有关英文

[ 中文 英文 英文简写 16 进制 H e x a d e c i m a l H 10 进制 D e c i m a l D 8 进制 O c t o n a r y O 2 进制 B i n a r y B ] \begin{bmatrix}\text{中文}&\text{英文}&\text{英文简写}\\16\text{进制}&\mathtt{Hexadecimal}&\mathtt{H}\\10\text{进制}&\mathtt{Decimal}&\mathtt{D}\\8\text{进制}&\mathtt{Octonary}&\mathtt{O}\\2\text{进制}&\mathtt{Binary}&\mathtt{B}\\\end{bmatrix} 中文16进制10进制8进制2进制英文HexadecimalDecimalOctonaryBinary英文简写HDOB

例题:

二进制数 101.11 101.11 101.11 对应的十进制数是( )。

A. 6.5

B. 5.5

C. 5.75

D. 5.25

CSP 2021 入门级第一轮第 7 7 7

小数二进制转十进制和整数二进制转十进制差不多,可以依葫芦画瓢

( 101.11 ) 2 = 1 × 2 2 + 1 × 2 0 + 1 × 2 − 1 + 1 × 2 − 2 = 4 + 1 + 0.5 + 0.25 = 5.75 \begin{aligned}(101.11)_2&=1\times2^2+1\times2^0+1\times2^{-1}+1\times2^{-2}\\&=4+1+0.5+0.25\\&=5.75\end{aligned} (101.11)2=1×22+1×20+1×21+1×22=4+1+0.5+0.25=5.75

综上,选 C \mathtt{C} C

请选出以下最大的数( )。

A. ( 550 ) 10 (550)_{10} (550)10

B. ( 777 ) 8 (777)_{8} (777)8

C. 2 10 2^{10} 210

D. ( 22 F ) 16 (22F)_{16} (22F)16

CSP 2020 提高级第一轮第 1 1 1

把四个选项转化成整数再比较

A \mathtt{A} A 选项:

( 550 ) 10 = 550 (550)_{10}=550 (550)10=550

B \mathtt{B} B 选项:

( 777 ) 8 = 7 × 8 2 + 7 × 8 1 + 7 × 8 0 = 7 × 64 + 56 + 7 = 448 + 63 = 511 \begin{aligned}(777)_8&=7\times8^2+7\times8^1+7\times8^0\\&=7\times64+56+7\\&=448+63\\&=511\end{aligned} (777)8=7×82+7×81+7×80=7×64+56+7=448+63=511

C \mathtt{C} C 选项:

2 10 = 1024 2^{10}=1024 210=1024

D \mathtt{D} D 选项:

( 22 F ) 16 = 2 × 1 6 2 + 2 × 1 6 1 + 15 × 1 6 0 = 2 × 256 + 32 + 15 = 512 + 47 = 559 \begin{aligned}(22F)_{16}&=2\times16^2+2\times16^1+15\times16^0\\&=2\times256+32+15\\&=512+47\\&=559\end{aligned} (22F)16=2×162+2×161+15×160=2×256+32+15=512+47=559

得到 511 < 550 < 559 < 1024 511<550<559<1024 511<550<559<1024 ,即 ( 777 ) 8 < ( 550 ) 10 < ( 22 F ) 16 < 2 10 (777)_8<(550)_{10}<(22F)_{16}<2^{10} (777)8<(550)10<(22F)16<210

C \mathtt{C} C

7. 排列组合

7.1. 两大原理

加法原理:完成一项工作有 n n n方法 a i ( 1 ≤ i ≤ n ) a_i(1\le i \le n) ai(1in) 代表完成第 i i i 类方法的数目,则共有 a 1 + a 2 + ⋯ + a n − 1 + a n a_1+a_2+\cdots+a_{n-1}+a_n a1+a2++an1+an 种不同的方法。

乘法原理:完成一项工作有 n n n步骤 a i ( 1 ≤ i ≤ n ) a_i(1\le i \le n) ai(1in) 代表完成第 i i i 步的数目,则共有 a 1 × a 2 × ⋯ × a n − 1 × a n a_1\times a_2\times\cdots\times a_{n-1}\times a_n a1×a2××an1×an 种不同的方法。

7.2. 排列(Arrangement/Permutation)

定义:从 n n n 个不同元素中,任取 m ( m ≤ n ) m(m\le n) m(mn) 个元素,按照一定顺序排成一列(即从 n n n 个不同元素中取出 m m m 个元素的一个排列),记作 A n m A_n^m Anm

计算公式: A n m = n ( n − 1 ) ( n − 2 ) ⋯ ( n − m + 1 ) = n ! ( n − m ) ! A_n^m=n(n-1)(n-2)\cdots(n-m+1)=\dfrac{n!}{(n-m)!} Anm=n(n1)(n2)(nm+1)=(nm)!n!

其中: n ! n! n! 表示阶乘,即 1 × 2 × 3 × ⋯ × ( n − 1 ) × n 1\times 2\times 3\times\cdots\times (n-1)\times n 1×2×3××(n1)×n特别的 0 ! = 1 0!=1 0!=1

显然,我们可以通过乘法原理,第一步(选第 1 1 1 个数)有 n n n 种方法,第二步(选第 2 2 2 个数)有 n − 1 n-1 n1 种方法(第一步已经选了 1 1 1 个数了,不能再选),第三步有 n − 2 n-2 n2 种方法…将所有的方法数目相乘,不难得到上面的公式

7.2.1. 全排列

排列的一种特殊情况,此时 n = m n=m n=m ,代入上述公式,有 A n m = n ! ( n − m ) ! = n ! A_n^m=\dfrac{n!}{(n-m)!}=n! Anm=(nm)!n!=n!

7.3. 组合(Combination)

定义:从 n n n 个不同元素中,任取 m ( m ≤ n ) m(m\le n) m(mn) 个元素组成一个集合(即不关心被选元素的顺序),记作 C n m C_n^m Cnm

公式: C n m = A n m m ! = n ! m ! ( n − m ) ! ​ C_n^m=\dfrac{A_n^m}{m!}=\dfrac{n!}{m!(n-m)!​} Cnm=m!Anm=m!(nm)!n!

显然,如果我们关心顺序,答案为 A n m A_n^m Anm ,但现在不关心顺序了,需要去重

在选出的 m m m 个元素中,会进行全排列,共 m ! m! m! ,但在组合问题中,都属于同一种,就需要除以 m ! m! m! ,这样,就得到了最终答案了

另外, ( n m ) \dbinom{n}{m} (mn) 也可以表示组合数,读作“n 选 m”,更为清晰明了

7.4. 排列组合解题技巧

7.4.1. 人肉枚举

顾名思义,手动的将所有的可能列出来(本蒟蒻最爱

7.4.2. 特殊相关

先处理特殊元素或者特殊位置,再考虑其他一般的元素

7.4.3. 简单优先

计算符合条件的数目比计算不符合条件数目简单时,我们可以计算不符合条件,剩下的就是符合条件的

7.4.4. 捆绑法

当题目要求某些元素必须相邻时,可以先把这些元素捆绑成一个元素进行处理

注意:这些捆绑在一起的元素内部还要进行一次排列组合

7.4.5. 插空法

当题目要求某些元素必须不相邻时,可以先把没有特殊要求的元素进行处理,对于剩下的特殊元素,分别插入已经排好的序列当中

7.4.6. 隔板法

要求将 n n n 个相同元素分成 m m m 组,每组至少有一个元素,相当于把 m − 1 m-1 m1 个隔板插到 n n n 个元素形成的 n − 1 n-1 n1 个空隙里

由于本蒟蒻基本上只会人肉枚举,所以挑两道简单例题

5 5 5 个小朋友并排站成一列,其中有两个小朋友是双胞胎,如果要求这两个双胞胎必须相邻,则有( )种不同排列方法?

A. 48

B. 36

C. 24

D. 72

CSP 2020 入门级第一轮第 10 10 10

采用捆绑法,将双胞胎视为一个人,那么, 4 4 4 个人的全排列结果为 A 4 4 A_4^4 A44 ,双胞胎内部还有一个 2 2 2 的全排列(即 A 2 2 A_2^2 A22),最终结果为 A 4 4 × A 2 2 = 4 ! × 2 ! = 48 A_4^4\times A_2^2=4!\times2!=48 A44×A22=4!×2!=48 ,选 A \mathtt{A} A

从一个 4 × 4 4\times 4 4×4 的棋盘中选取不在同一行也不在同一列上的两个方格,共有( )种方法。

A. 60

B. 72

C. 86

D. 64
CSP 2020 提高级第一轮第 13 13 13

首先选择第一个格子,共 16 16 16 种选择方案

在选择了第一个格子后,同列有 3 3 3 个格子不能选(除去该格子本身),同列有 3 3 3 个格子不能选(除去该格子本身),加上该格子本身,共有 7 7 7 个格子不能选,那么第二个格子共有 9 9 9 选择方案

考虑该题是组合相关,所以答案为 16 × 9 ÷ 2 = 72 16\times9\div2=72 16×9÷2=72 ,选 B \mathtt{B} B

8. 国内外的 OI 比赛

NOIP(National Olympiad in Informatics in Provinces),全国青少年信息学奥林匹克联赛(省级),开办于 1995 年,截止 2018 已举办 24 届,2019 年暂停,2020 年恢复。

复赛使用 C、C++、Pascal2022 年后只能使用 C++

复赛使用 NOI Linux 评测。

NOI(National Olympiad in Informatics):全国青少年计算机程序设计竞赛,开办于 1984 年,现更名全国青少年信息学奥林匹克竞赛

特别的,如果题目询问了 NOIP 举办了多少届需要扣除一届,因为 CSP 举行的时候 NOIP 还没有举行

APIO(Asia-Pacific Informatics Olympiad):亚洲与太平洋地区信息学奥林匹克竞赛。

IOI(International Olympiad in Informatics):国际信息学奥林匹克竞赛,等级最高的信息学竞赛

9. 分辨率相关

分辨率:屏幕上显示的像素个数,分辨率 160 × 128 160\times128 160×128 的意思是水平方向含有像素数为 160 160 160 个,垂直方向像素数 128 128 128 个。

一般来说:题目会给出一张图片的分辨率和色彩的位率,要算出这张图片所占的空间(一般是 MB)。

计算公式:水平方向像素数 × 垂直方向像素数 × 色彩位率 = 图片所占空间(单位: b i t \mathtt{bit} bit

注意单位转化!

视频大小:单张图片的所占空间 × 图片张数 = 水平方向像素数 × 垂直方向像素数 × 色彩位率 × 视频时长 × 视频帧数 = 视频所占空间((单位: b i t \mathtt{bit} bit

例题

现有一张分辨率为 2048 × 1024 2048\times 1024 2048×1024 像素的 32 32 32 位真彩色图像。请问要存储这张图像,需要多大的存储空间?( )。

A. 16MB

B. 4MB

C. 8MB

D. 2MB

CSP 2020 入门级第一轮第 4 4 4

相当简单的一道题,套公式:

ans ⁡ = 2048 × 1024 × 32 1024 × 1024 × 8 = 8   K B \operatorname{ans}=\dfrac{2048\times1024\times32}{1024\times1024\times8}=8\ \mathtt{KB} ans=1024×1024×82048×1024×32=8 KB

直接选 C \mathtt{C} C

现有一段 8 8 8 分钟的视频文件,它的播放速度是每秒 24 24 24 帧图像,每帧图像是 一幅分辨率为 2048 × 1024 2048\times 1024 2048×1024 像素的 32 32 32 位真彩色图像。请问要存储这段原始无压缩视频,需要多大的存储空间?( )。

A. 30G

B. 90G

C. 150G

D. 450G

CSP 2020 提高级第一轮第 3 3 3

套公式,但是注意单位

ans ⁡ = 2048 × 1024 × 32 × 24 × 8 × 60 1024 × 1024 × 1024 × 8 = 2 × 32 × 24 × 60 1024 = 92160 1024 = 90   G B \begin{aligned}\operatorname{ans}&=\dfrac{2048\times1024\times32\times24\times8\times60}{1024\times1024\times1024\times8}\\&=\dfrac{2\times32\times24\times60}{1024}\\&=\dfrac{92160}{1024}\\&=90\ \mathtt{GB}\end{aligned} ans=1024×1024×1024×82048×1024×32×24×8×60=10242×32×24×60=102492160=90 GB

综上,选 B \mathtt{B} B

下面知识点是比较重要的(个人观点)

10. 计算机分类

10.1. 年代分类

[ 年代 实现方式 1949 ∼ 1958 电子管 1959 ∼ 1964 晶体管 1965 ∼ 1970 集成电路 1971 ∼ 现在 超大规模集成电路 ] \begin{bmatrix}\text{年代}&\text{实现方式}\\1949\sim1958&\text{电子管}\\1959\sim1964&\text{晶体管}\\1965\sim1970&\text{集成电路}\\1971\sim\text{现在}&\text{超大规模集成电路}\end{bmatrix} 年代1949195819591964196519701971现在实现方式电子管晶体管集成电路超大规模集成电路

10.2. 性能分类

下表按性能从大到小分类

[ 名称 特点 应用 巨型机 ( 超级计算机或超算 ) 速度极快,容量极高,体积极大 计算地震,太空,天气预报等复杂计算 大/中型机 速度快,容量极高,体积大 顶尖科研领域 小型机 速度快,容量高,体积中 单位服务器 微型机 速度快,容量中,体积小 个人工作/处理数据 工作站 速度快,容量中,体积小 辅助微型机工作 ] \begin{bmatrix}\text{名称}&\text{特点}&\text{应用}\\\text{巨型机}(\text{超级计算机或超算})&\text{速度极快,容量极高,体积极大}&\text{计算地震,太空,天气预报等复杂计算}\\\text{大/中型机}&\text{速度快,容量极高,体积大}&\text{顶尖科研领域}\\\text{小型机}&\text{速度快,容量高,体积中}&\text{单位服务器}\\\text{微型机}&\text{速度快,容量中,体积小}&\text{个人工作/处理数据}\\\text{工作站}&\text{速度快,容量中,体积小}&\text{辅助微型机工作}\end{bmatrix} 名称巨型机(超级计算机或超算)/中型机小型机微型机工作站特点速度极快,容量极高,体积极大速度快,容量极高,体积大速度快,容量高,体积中速度快,容量中,体积小速度快,容量中,体积小应用计算地震,太空,天气预报等复杂计算顶尖科研领域单位服务器个人工作/处理数据辅助微型机工作

另外:微型机在 20 20 20 世纪 70 70 70 年代后就非常普及了

各位面前的电脑就是微型机

11. 计算机的构成

计算机必须由运算器、控制器、存储器、输入设备、输出设备构成,否则,计算机会直接摆烂

对了,上文说的冯·诺依曼,是他提出了这个结构,因此,该结构被称为冯·诺依曼结构

11.1. 存储器相关

  1. 内存储器:简称内存,用于电脑内部的存储,相对外存而言,读写速度快,但是存储空间小,并且存储在 RAM 里的数据断电后会丢失,注意与外存区分开

  2. RAM(Random Access Memory):随机存取存储器,可与 CPU 直接交互数据,可随时读写断电数据全部丢失

  3. ROM(Read-Only Memory):只读存储器,只能读出无法写入信息,信息一旦写入后就固定下来,断电数据不会丢失,故又称为固定存储器

  4. 外存储器:简称外存,用于处置长期保存的数据,一般处于电脑外部断电后数据不会丢失,相对内存而言,外存读写速度慢,但存储容量大,主要包括硬盘、光盘、U 盘(USB闪存盘)等类型

11.1.1. CPU 相关

CPU ,即中央处理器(Central Processing Unit)由运算器,控制器和寄存器组成,其中,运算器起计算功能,控制器起指挥功能,出现于 20 20 20 世纪 70 70 70 年代

11.2. 其它构成相关

运算器:运算器包含了算术逻辑运算单元(ALU)及浮点运算单元(FPU)

输入设备:在计算机与人交互时,接受外部命令或者需要加工的数据,常用的输入数据包括键盘、鼠标、麦克风、摄像头

输出设备:在计算机与人交互时,将处理结果以人类能够识别(感受)的方式呈现出来的设备,常有的输出设备包括显示器、音响、打印机

12. 文件扩展名

注意:是扩展名,不是拓展名

[ 文件类型 文件扩展名 图片 j p g / j p e g / p n g / p i c / b m p / g i f 音频 m p 3 / w a v 视频 m p 4 / a v i / m p e g / f l v / r m v b / r p m ] \begin{bmatrix} \text{文件类型}&\text{文件扩展名}\\ \text{图片}&\mathtt{jpg/jpeg/png/pic/bmp/gif}\\ \text{音频}&\mathtt{mp3/wav}\\ \text{视频}&\mathtt{mp4/avi/mpeg/flv/rmvb/rpm}\\ \end{bmatrix} 文件类型图片音频视频文件扩展名jpg/jpeg/png/pic/bmp/gifmp3/wavmp4/avi/mpeg/flv/rmvb/rpm

例题:

下列属于图像文件格式的有()

A. WMV

B. MPEG

C. JPEG

D. AVI

CSP 2019 提高级第一轮第 2 2 2

死记硬背的知识,选 C \mathtt{C} C

13. ASCLL 码

ASCLL 码,即美国国家交换标准代码,现为世界交换代码标准

ASCLL 码是由 8 8 8 个比特组成的二进制编码(即一个字节大小),用于表示 128 128 128 个国际常用字符

下表所列举的是常考字符及其 ASCLL 码,完整版这边走

[ A S C L L 码 对应字符 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 57 9 65 A 66 B 67 C 68 D 69 E 70 F 71 G 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W 88 X 89 Y 90 Z 97 a 98 b 99 c 100 d 101 e 102 f 103 g 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w 120 x 121 y 122 z ] \begin{bmatrix} \mathsf{ASCLL}\text{码}&\text{对应字符}\\ 48&\mathtt{0}\\ 49&\mathtt{1}\\ 50&\mathtt{2}\\ 51&\mathtt{3}\\ 52&\mathtt{4}\\ 53&\mathtt{5}\\ 54&\mathtt{6}\\ 55&\mathtt{7}\\ 56&\mathtt{8}\\ 57&\mathtt{9}\\ 65&\mathtt{A}\\ 66&\mathtt{B}\\ 67&\mathtt{C}\\ 68&\mathtt{D}\\ 69&\mathtt{E}\\ 70&\mathtt{F}\\ 71&\mathtt{G}\\ 72&\mathtt{H}\\ 73&\mathtt{I}\\ 74&\mathtt{J}\\ 75&\mathtt{K}\\ 76&\mathtt{L}\\ 77&\mathtt{M}\\ 78&\mathtt{N}\\ 79&\mathtt{O}\\ 80&\mathtt{P}\\ 81&\mathtt{Q}\\ 82&\mathtt{R}\\ 83&\mathtt{S}\\ 84&\mathtt{T}\\ 85&\mathtt{U}\\ 86&\mathtt{V}\\ 87&\mathtt{W}\\ 88&\mathtt{X}\\ 89&\mathtt{Y}\\ 90&\mathtt{Z}\\ 97&\mathtt{a}\\ 98&\mathtt{b}\\ 99&\mathtt{c}\\ 100&\mathtt{d}\\ 101&\mathtt{e}\\ 102&\mathtt{f}\\ 103&\mathtt{g}\\ 104&\mathtt{h}\\ 105&\mathtt{i}\\ 106&\mathtt{j}\\ 107&\mathtt{k}\\ 108&\mathtt{l}\\ 109&\mathtt{m}\\ 110&\mathtt{n}\\ 111&\mathtt{o}\\ 112&\mathtt{p}\\ 113&\mathtt{q}\\ 114&\mathtt{r}\\ 115&\mathtt{s}\\ 116&\mathtt{t}\\ 117&\mathtt{u}\\ 118&\mathtt{v}\\ 119&\mathtt{w}\\ 120&\mathtt{x}\\ 121&\mathtt{y}\\ 122&\mathtt{z}\\ \end{bmatrix} ASCLL484950515253545556576566676869707172737475767778798081828384858687888990979899100101102103104105106107108109110111112113114115116117118119120121122对应字符0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz

上表由程序打出

14. 逻辑运算

14.1. 逻辑符号

  1. 逻辑非:符号为 ! ! ! ¬ \lnot ¬ ,计算方法为:

¬ a = { 1 a = 0 0 a = 1 \lnot a=\begin{cases}1&a=0\\0&a=1\end{cases} ¬a={10a=0a=1

  1. 逻辑与:符号为 & & \&\& && ∧ \land ,计算方法为:

a ∧ b = { 1 a = 1 and ⁡ b = 1 0 otherwise ⁡ a\land b=\begin{cases}1&a=1 \operatorname{and} b=1\\0&\operatorname{otherwise}\end{cases} ab={10a=1andb=1otherwise

  1. 逻辑或:符号为 ∥ \| ∨ \lor ,计算方法为:

a ∨ b = { 1 a = 1 or ⁡ b = 1 0 otherwise ⁡ a\lor b=\begin{cases}1&a=1 \operatorname{or} b=1\\0&\operatorname{otherwise}\end{cases} ab={10a=1orb=1otherwise

14.2. 按位符号(感觉很奇怪?)

  1. 按位与:符号为 & \& & ,将参加运算的两个数按二进制位进行运算,如果两个相应位同时 1 1 1,该位结果为 1 1 1,否则为 0 0 0

  2. 按位或:符号为 ∣ ⁡ \operatorname{|} ,将参加运算的两个数按二进制位进行运算,如果两个相应位至少 1 1 1 个为 1 1 1,该位结果为 1 1 1,否则为 0 0 0

  3. 按位异或:符号为 ∧ \land (注意,按位异或与逻辑与是有区别的,但是蒟蒻打不出来按位异或的符号,只能将就代替一下),将参加运算的两个数按二进制位进行异或运算,如果两个相应位为(即值不同),则该位结果为 1 1 1,否则为 0 0 0

以上所有的运算中,负数以补码形式参加运算

特别的,在进行按位运算时,如果位数不够,需要在位数少的数前补 0 0 0

顺带一提,有关各种符号的优先级,由于蒟蒻不太会打表格,所以,这里无法展现出来(悲

所以,这里推荐一个博客

例题:

二进制数 11101110010111 \mathtt{11 1011 1001 0111} 11101110010111 01011011101011 \mathtt{01 0110 1110 1011} 01011011101011 进行逻辑与运算的结果是()。

A. 01001010001011 \mathtt{01 0010 1000 1011} 01001010001011

B. 01001010010011 \mathtt{01 0010 1001 0011} 01001010010011

C. 01001010000001 \mathtt{01 0010 1000 0001} 01001010000001

D. 01001010000011 \mathtt{01 0010 1000 0011} 01001010000011

CSP 2019 入门级第一轮第 2 2 2

没啥难度,直接算

11101110010111 & 01011011101011                               ‾ 01001010000011 \begin{aligned}&\mathtt{11 1011 1001 0111}\\\&&\mathtt{01 0110 1110 1011}\\&\overline{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }\\&\mathtt{01001010000011}\end{aligned} &1110111001011101011011101011                             01001010000011

D \mathtt{D} D

x=true,y=true,z=false,以下逻辑运算表达式值为真的是( )。

A. (y∨z)∧x∧z

B. x∧(z∨y) ∧z

C. (x∧y) ∧z

D. (x∧y)∨(z∨x)
CSP 2020 入门级第一轮第 3 3 3

直接算

A \mathtt{A} A 选项:

( y ∨ z ) ∧ x ∧ z = ( 1 ∣ 0 ) & 1 & 0 = 1 & 0 = 0 \begin{aligned}(y∨z)∧x∧z&=(1|0)\&1\&0\\&=1\&0\\&=0\end{aligned} (yz)xz=(1∣0)&1&0=1&0=0

B \mathtt{B} B 选项:

x ∧ ( z ∨ y ) ∧ z = 1 & ( 0 ∣ 1 ) & 0 = 0 & 1 = 0 \begin{aligned}x∧(z∨y) ∧z&=1\&(0|1)\&0\\&=0\&1\\&=0\end{aligned} x(zy)z=1&(0∣1)&0=0&1=0

C \mathtt{C} C 选项:

( x ∧ y ) ∧ z = ( 1 & 1 ) & 0 = 1 & 0 = 0 \begin{aligned}(x∧y) ∧z&=(1\&1)\&0\\&=1\&0\\&=0\end{aligned} (xy)z=(1&1)&0=1&0=0

D \mathtt{D} D 选项:

( x ∧ y ) ∨ ( z ∨ x ) = ( 1 & 1 ) ∣ ( 0 ∣ 1 ) = 1 ∣ 1 = 1 \begin{aligned}(x∧y)∨(z∨x)&=(1\&1)|(0|1)\\&=1|1\\&=1\end{aligned} (xy)(zx)=(1&1)(0∣1)=1∣1=1

综上,选 D \mathtt{D} D

15. 再谈数据结构

How old are you?(怎么老是你)

15.1 图论基础

边(Edge):结点之间的连线

完全图:任意两点都有边相连的图

一个 n n n 个节点完全图的边数 S = C n 2 = n ( n − 1 ) 2 S=C_n^2= \dfrac{n(n-1)}{2} S=Cn2=2n(n1)

简单路径:两点之间通过不重复的边相连

连通图:任意两点都可以直接或间接到达

注意:完全图属于连通图,连通图不一定属于完全图

有向图:边是有方向的(即有一条边,可以从 u u u 到达 v v v ,但不能从 v v v 到达 u u u

无向图:边是无方向的(即有一条边,可以从 u u u 到达 v v v ,但不能从 v v v 到达 u u u

环:对于一个路径 w w w,若结点 v v v 既是起点,又是终点,且结点 v v v 是该路径中唯一一个出现两次的,则 w w w 是一个环

特别的,如果环 w w w 只有一个点,则被称为自环

入度:以结点 v v v终点的边的条数为该结点的入度

出度:以结点 v v v起点的边的条数为该结点的出度

举个例子:

在这里插入图片描述

如上图:这是一个完全图,也是一个无向图,其中, 2 → 1 2\rightarrow1 21 就是一条简单路径

在这里插入图片描述
如上图:这是一个连通图,其中, 1 → 2 → 3 → 1 1\rightarrow2\rightarrow3\rightarrow1 1231 是一个环

在这里插入图片描述

如图,这是一个有向图,其中, 2 2 2 号结点的出度和入度都是 1 1 1

15.2. 栈

定义:对于栈而言,先进来的后出去,后进来的先出去,因此,栈也被称为后进先出(last in first out)表,简称 LIFO 表

栈顶:栈最顶端的元素

栈底:栈最底端的元素

15.2.1. 栈的常见操作

  1. qush ⁡ ( x ) \operatorname{qush}(x) qush(x) :往栈顶添加元素 x x x
  2. qoq ⁡ ( x ) \operatorname{qoq}(x) qoq(x) :从栈顶删除元素 x x x
  3. top ⁡ ( x ) \operatorname{top}(x) top(x) :返回栈顶元素的值
  4. emprt ⁡ ( ) \operatorname{emprt}() emprt() :判断栈是否为空(为空返回 1 1 1 ,否则返回 0 0 0
  5. size ⁡ ( ) \operatorname{size}() size() :返回栈内元素数量

15.3. 队列

定义:对于队列而言,先进来的先出去,后进来的后出去,因此,队列也被称为先进先出(first in first out)表,简称 FIFO 表

队首(头):队列的第一项元素

队尾:队列的最后一项元素

15.3.1. 队列的常见操作

  1. qush ⁡ ( x ) \operatorname{qush}(x) qush(x) :往队尾添加元素 x x x
  2. qoq ⁡ ( x ) \operatorname{qoq}(x) qoq(x) :从队首删除元素 x x x
  3. front ⁡ ( x ) \operatorname{front}(x) front(x) :返回队首元素的值
  4. emprt ⁡ ( ) \operatorname{emprt}() emprt() :判断队列是否为空(为空返回 1 1 1 ,否则返回 0 0 0
  5. size ⁡ ( ) \operatorname{size}() size() :返回队列内元素数量

15.4. 链表

链表和数组都可用于存储数据,其中链表通过指针来连接元素,而数组则是把所有元素按次序依次存储

链表可以方便地删除、插入数据,其时间复杂度是 O ( 1 ) O(1) O(1) ,但是访问任意数据时时间复杂度是 O ( n ) O(n) O(n) ,因此,链表不可以随机访问任意数据

15.5. 字符串

字符串指一串字符组成的串

15.5.1. 子串相关

子串被定义为字符串任意个连续的字符组成的子序列子串一定是连续子序列可以是不连续

现有一个长度为 n n n 的字符串,则其非空子串的数量 S S S 的计算公式为 S = n ( n + 1 ) 2 S=\dfrac{n(n+1)}{2} S=2n(n+1)

15.6. 前缀,中缀,后缀表达式

中缀表达式:就是我们常见的算数表达式,其运算符在操作数中间,且有括号一种表达式表达形式,比如 1 + ( 2 − 3 ) × 4 1+(2-3)\times 4 1+(23)×4

前缀表达式:在该表达式下,其运算符在操作数前,比如: 1 + ( 2 − 3 ) × 4 1+(2-3)\times 4 1+(23)×4 的前缀表达式为 + 1 × −   234 +1\times -\ 234 +1× 234

后缀表达式:在该表达式下,其运算符在操作数后,比如: 1 + ( 2 − 3 ) × 4 1+(2-3)\times 4 1+(23)×4 的前缀表达式为 123 − 4 × + 123-4\times+ 1234×+

15.6.1. 前(后)缀转中缀

我们可以画出其对应的表达式树(该数是一颗二叉树

那么,怎么塞呢?

对于前缀表达式而言,我们要从前到后遍历,对于当前字符,如果是一个数字字符,直接塞入树中,否则,先将该字符塞入树中,再分别塞入其左孩子和右孩子

现在,我们以 + 1 × −   234 +1\times -\ 234 +1× 234 举例

首先,我们遍历到第 1 1 1 个字符—— + + + ,这是一个运算符,所以,先把它塞入树中

在这里插入图片描述

接下来,塞+结点的左孩子

第二个字符为 1 1 1 ,这是一个数字字符,直接塞

在这里插入图片描述

下一个,塞+字符的右孩子

第三个字符为 × \times × ,塞

在这里插入图片描述

下一个,塞X字符的左孩子

第四个字符为 − - ,塞

在这里插入图片描述

下一个,塞-字符的左孩子

第五个字符为 2 2 2 ,塞

在这里插入图片描述

下一个,塞-字符的右孩子

第六个字符为 3 3 3 ,塞

在这里插入图片描述

下一个,塞X字符的右孩子

第七个字符为 4 4 4 ,塞

在这里插入图片描述

终于打完了

至此,我们已经得到了一颗表达树,对于该表达树而言,其先序遍历就是该表示式的前缀表达式中序遍历就是该表示式的中缀表达式后序遍历就是该表示式的后缀表达式

所以,得到 + 1 × −   234 +1\times -\ 234 +1× 234 的中序表达式 1 + ( 2 − 3 ) × 4 1+(2-3)\times 4 1+(23)×4

对于后缀表达式而言,我们要从后到前遍历,对于当前字符,如果是一个数字字符,直接塞入树中,否则,先将该字符塞入树中,再分别塞入其右孩子和左孩子

这里不举例了(实际上是懒得打

15.6.2. 中缀转前(后)缀

一般来讲,中缀转前(后)缀,我们可以不用通过表达式树来转化,我们用更简单的做法

我们可以先按照优先级顺序,分别将某一个简单的表达式(即操作数 表达式 操作数的形式)转化成一个前(后)缀表达式,并将其看成一个整体进行计算

举个例子:我们要将 1 + ( 2 − 3 ) × 4 1+(2-3)\times 4 1+(23)×4 转化成后缀表达式,先处理括号内的表达式(当一个表达式转化成一个整体时,将采用{a}的形式表示)

1 + ( 2 − 3 ) × 4 → 1 + { 23 − } × 4 1+(2-3)\times 4\rightarrow1+\{23-\}\times4 1+(23)×41+{23}×4

接下来,处理乘法表达式

1 + { 23 − } × 4 → 1 + { 23 − 4 × } 1+\{23-\}\times4\rightarrow1+\{23-4\times\} 1+{23}×41+{234×}

最后,处理加法表达式

1 + { 23 − 4 × } → 123 − 4 × + 1+\{23-4\times\}\rightarrow123-4\times+ 1+{234×}1234×+

到此,转化完毕

例题:

G G G 是一个非连通简单无向图(没有自环和重边),共有 36 36 36 条边,则该图至少有( )个点。

A. 8

B. 9

C. 10

D. 11
CSP 2021 提高级第一轮第 7 7 7

我们可以分别将有 n n n 个结点的非连通简单无向图最多边数求出来

如果这个图是简单无向图,那么最多边数就是 n ( n − 1 ) 2 \dfrac{n(n-1)}{2} 2n(n1)

但是,题目要求为非连通简单无向图,我们就要选择一个结点 a a a,删除与该结点相连的所有边,在简单无向图的最多边数的情况下,任意一个结点都有 n − 1 n-1 n1 条边与之相连,所以,在简单无向图的最多边数的结果下,减去 n − 1 n-1 n1 即可,即最终公式为 n ( n − 1 ) 2 − n + 1 \dfrac{n(n-1)}{2}-n+1 2n(n1)n+1

A \mathtt{A} A 选项:

n ( n − 1 ) 2 − n + 1 = 8 × ( 8 − 1 ) 2 − 8 + 1 = 4 × 7 − 7 = 3 × 7 = 21 \begin{aligned}\dfrac{n(n-1)}{2}-n+1&=\dfrac{8\times(8-1)}{2}-8+1\\&=4\times7-7\\&=3\times7\\&=21\end{aligned} 2n(n1)n+1=28×(81)8+1=4×77=3×7=21

B \mathtt{B} B 选项:

n ( n − 1 ) 2 − n + 1 = 9 × ( 9 − 1 ) 2 − 9 + 1 = 9 × 4 − 8 = 36 − 8 = 28 \begin{aligned}\dfrac{n(n-1)}{2}-n+1&=\dfrac{9\times(9-1)}{2}-9+1\\&=9\times4-8\\&=36-8\\&=28\end{aligned} 2n(n1)n+1=29×(91)9+1=9×48=368=28

C \mathtt{C} C 选项:

n ( n − 1 ) 2 − n + 1 = 10 × ( 10 − 1 ) 2 − 10 + 1 = 5 × 9 − 9 = 4 × 9 = 36 \begin{aligned}\dfrac{n(n-1)}{2}-n+1&=\dfrac{10\times(10-1)}{2}-10+1\\&=5\times9-9\\&=4\times9\\&=36\end{aligned} 2n(n1)n+1=210×(101)10+1=5×99=4×9=36

D \mathtt{D} D 选项:

n ( n − 1 ) 2 − n + 1 = 11 × ( 11 − 1 ) 2 − 11 + 1 = 11 × 5 − 10 = 55 − 10 = 45 \begin{aligned}\dfrac{n(n-1)}{2}-n+1&=\dfrac{11\times(11-1)}{2}-11+1\\&=11\times5-10\\&=55-10\\&=45\end{aligned} 2n(n1)n+1=211×(111)11+1=11×510=5510=45

综上,选 C \mathtt{C} C

今有一空栈 S S S,对下列待进栈的数据元素序列 a , b , c , d , e , f \mathtt{a,b,c,d,e,f} a,b,c,d,e,f 依次进行:进栈,进栈,出栈,进栈,进栈,出栈的操作,则此操作完成后,栈底元素为( )。

A. b

B. a

C. d

D. c

CSP 2020 提高级第一轮第 4 4 4

模拟一下:

在这里插入图片描述
第一步,进栈

在这里插入图片描述

第二步,进栈

在这里插入图片描述
第三步,出栈

在这里插入图片描述

第四步,进栈

在这里插入图片描述

第五步,进栈

在这里插入图片描述

第六步,出栈

在这里插入图片描述

注意审题,题目要求栈底元素,选 b \mathtt{b} b

链表不具有的特点是()

A. 插入删除不需要移动元素

B. 不必事先估计存储空间

C. 所需空间与线性表长度成正比

D. 可随机访问任一元素

CSP 2019 入门级第一轮第 6 6 6

死记硬背的知识,选 D \mathtt{D} D

表达式 a × ( b + c ) × d \mathtt{a\times(b+c)\times d} a×(b+c)×d的后缀表达式为( ),其中 + + + × \times × 是运算符。

A. × × a + b c d \mathtt{\times\times a+bcd} ××a+bcd

B. a b c + × d × \mathtt{abc+\times d\times} abc+×d×

C. a b c + d × × \mathtt{abc+d\times\times} abc+d××

D. × a × + b c d \mathtt{\times a\times+bcd} ×a×+bcd

CSP 2021 入门级第一轮第 9 9 9

直接模拟就行(当一个表达式转化成一个整体时,将采用{a}的形式表示)

a × ( b + c ) × d → a × { b c + } × d → { a b c + × } × d → a b c + × d × \mathtt{a\times(b+c)\times d}\rightarrow\mathtt{a\times\{bc+\}\times d\rightarrow\{abc+\times\}\times d\rightarrow abc+\times d\times} a×(b+c)×da×{bc+}×d{abc+×}×dabc+×d×

综上,选 B \mathtt{B} B

16. 数学

16.1. 最大公约数和最小公倍数

众所周知:现有两数 a , b a,b a,b ,我们用 gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b) 表示 a , b a,b a,b 的最大公约数,用 lcm ⁡ ( a , b ) \operatorname{lcm}(a,b) lcm(a,b) 表示 a , b a,b a,b 的最大公倍数,而我们又知道, a , b , gcd ⁡ ( a , b ) , lcm ⁡ ( a , b ) a,b,\gcd(a,b),\operatorname{lcm}(a,b) a,b,gcd(a,b),lcm(a,b) 这四个数中,有一个恒等式:

a × b = gcd ⁡ ( a , b ) × lcm ⁡ ( a , b ) a\times b=\gcd(a,b)\times\operatorname{lcm}(a,b) a×b=gcd(a,b)×lcm(a,b)

所以,这里只介绍 gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b) 的求法, lcm ⁡ ( a , b ) \operatorname{lcm}(a,b) lcm(a,b) 的结果可以通过上面的恒等式求出

那么,我们可以通过辗转相除法快速求解,其计算方法如下

gcd ⁡ ( a , b ) = { a b = 0 gcd ⁡ ( b , a % b ) b ≠ 0 \gcd(a,b)=\begin{cases}a&b=0\\\gcd(b,a\%b)&b\ne0\end{cases} gcd(a,b)={agcd(b,a%b)b=0b=0

非常简单,通过一道例题来举个例子:

319 319 319 377 377 377 的最大公约数是()。

A. 27 27 27

B. 33 33 33

C. 29 29 29

D. 31 31 31

CSP 2019 入门级第一轮第 10 10 10

直接套公式计算:

gcd ⁡ ( 319 , 377 ) → gcd ⁡ ( 377 , 319 ) → gcd ⁡ ( 319 , 58 ) → gcd ⁡ ( 58 , 29 ) → gcd ⁡ ( 29 , 0 ) \gcd(319,377)\rightarrow\gcd(377,319)\rightarrow\gcd(319,58)\rightarrow\gcd(58,29)\rightarrow\gcd(29,0) gcd(319,377)gcd(377,319)gcd(319,58)gcd(58,29)gcd(29,0)

综上, gcd ⁡ ( 319 , 377 ) = 29 \gcd(319,377)=29 gcd(319,377)=29 ,选 C \mathtt{C} C

16.2. 质数

定义:在大于 1 1 1 的自然数中,除了 1 1 1 和它本身以外不再有其他因数的自然数,否则称为合数

特别的, 1 1 1 既不是质数也不是合数

另附 100 100 100 以内的 25 25 25 个质数:

2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 , 23 , 29 , 31 , 37 , 41 , 43 , 47 , 53 , 59 , 61 , 67 , 71 , 73 , 79 , 83 , 89 , 97 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97

例题:

100 100 100 以内最大的素数是()。

A. 89 89 89

B. 97 97 97

C. 91 91 91

D. 93 93 93

CSP 2019 入门级第一轮第 9 9 9

死记硬背的知识,选 B \mathtt{B} B

17. 复杂度

17.1. 时间复杂度

对于一个程序而言,我们可以用一个式子表示该程序的时间复杂度,取这个式子的最高次项且忽略系数,就是该程序的时间复杂度

特别的,常量不应该出现在时间复杂度中(宏定义的值也算常量

对于时间复杂度而言,分为非递归和递归

17.1.1. 非递归时间复杂度

对于非递归程序而言,相对简单,直接数循环

举个例子:

for(int i=1;i<=n;i++){
	for(int j=1;j<=n;j++){
		ans+=a[i][j];
	}
}

这个程序很简单,其时间复杂度为 O ( n 2 ) O(n^2) O(n2)

for(int i=1;i<=n;i++){
	for(int j=1;j<=n;j++){
		ans+=a[i][j];
	}
	for(int j=1;j<=m;j++){
		ans-=j;
	}
}

这个程序稍微复杂(也复杂不了多少),其时间复杂度为 O ( n × ( n + m ) ) O(n\times(n+m)) O(n×(n+m))

17.1.2. 递归时间复杂度

一般来讲,我们有两种方法来解决:

17.1.2.1. 主定理

作为一名蒟蒻,我是真的不会主定理(哭唧唧

所以,这里推荐一个博客

17.1.2.2. 递归树

只可意会,不可言传

我们举一个例子来说:

T ( x ) = { 1 n = 1 2 T ( n 2 ) + n n > 1 \text{T}(x)=\begin{cases}1&n=1\\2\text{T}(\dfrac{n}{2})+n&n>1\end{cases} T(x)={12T(2n)+nn=1n>1

对于这样一个时间复杂度的定义,我们可以画出其对应的递归树

加粗样式

我们可以发现,这棵树的高度可以看成 log ⁡ n \log n logn,而每一层到每一层之间的时间复杂度为 n n n 所以,原递归式的时间复杂度为 O ( n log ⁡ n ) O(n\log n) O(nlogn)

当然,如果你没有看懂(恐怕也没人看懂,甚至是不是对的我都不知道QAQ),可以看看上面这个博客

17.2. 空间复杂度

这和就超级简单了,直接数数组维数即可,如果没有数组,则空间复杂度为 O ( 1 ) O(1) O(1)

由于蒟蒻能力不足,找到了例题,但给不出解析(悲

18. IP

题外话,这个就与 IP 有关(笑

IP 本质上是四个八位二进制数,为了方便表达改为四个十进制数 ,以 . 隔开,每一个数字取 0 ∼ 255 0\sim255 0255,例如 11.4.5.14

蛤?问我为什么 IP 分割成 4 4 4 份?

哈,我不知道……

相信大家都听说过洛谷封IP这个惩罚,那么,这个惩罚的实现方式十分简单,如:需要把 12.34.56.0 到 12.34.56.255 内的 IP 全部封号,只需要封 12.34.56.* 即可达到操作。

19. 各种缩写

英语不好,只能无能狂怒

局域网:LAN(Local Area Network),小范围的网络, 1 1 1 千米以内传输效率极高,结构简单。

城域网:MAN(Metropolitan Area Network),数千米至数十千米内。

广域网:WAN(Wide Area Network),数十千米至数千千米以上。

随机存储器:RAM(Random Access Memory)。

只读存储器:ROM(Read Only Memory)。

万维网:WWW(World Wide Web)。

文件传输协议:FTP(File Transfer Protocol)。

简单邮件传输协议:SMTP(Simple Mail Transfer Protocol)。

对等网络:P2P(peer-t(w)o-peer),音译。

邮局协议第三版 :POP3(Post Office Protocol - Version 3)。

传输控制协议:TCP(Transmission Control Protocol)。

用户数据报协议:UDP(User Datagram Protocol)。

交互邮件访问协议:IMAP(Internet Message Access Protocol)。

超文本传输协议:HTTP(S)(Hyper Text Transfer Prtcl(over Securesocket ayer)),带 “S”的为增加了传输加密和身份认证。

以下都是与算法有关

20. 排序

对于排序,我们需要了解其一般时间复杂度,最坏情况时间复杂度,最好情况时间复杂度,空间复杂度和稳定性

X选择排序冒泡排序插入排序快速排序希尔排序堆排序归并排序基数排序
一般时间复杂度 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n log ⁡ n ) O(n\log n) O(nlogn) O ( n 1.3 ) O(n^{1.3}) O(n1.3) O ( n log ⁡ n ) O(n\log n) O(nlogn) O ( n log ⁡ n ) O(n\log n) O(nlogn) O ( n k ) O(nk) O(nk)
最坏情况时间复杂度 O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n 2 ) O(n^2) O(n2) O ( n 1.3 ) O(n^{1.3}) O(n1.3) O ( n log ⁡ n ) O(n\log n) O(nlogn) O ( n log ⁡ n ) O(n\log n) O(nlogn) O ( n k ) O(nk) O(nk)
最好情况时间复杂度 O ( n 2 ) O(n^2) O(n2) O ( n ) O(n) O(n) O ( n ) O(n) O(n) O ( n ) O(n) O(n) O ( n 1.3 ) O(n^{1.3}) O(n1.3) O ( n log ⁡ n ) O(n\log n) O(nlogn) O ( n log ⁡ n ) O(n\log n) O(nlogn) O ( n k ) O(nk) O(nk)
空间复杂度 O ( 1 ) O(1) O(1) O ( 1 ) O(1) O(1) O ( 1 ) O(1) O(1) O ( n ) O(n) O(n) O ( 1 ) O(1) O(1) O ( 1 ) O(1) O(1) O ( n ) O(n) O(n) O ( n ) ? O(n)? O(n)?
稳定性不稳定稳定稳定不稳定不稳定不稳定稳定稳定

注:基数排序中的 k k k 表示所要排序的数列中最高位数

例题:

排序的算法很多,若按排序的稳定性和不稳定性分类,则()是不稳定排序。

A. 冒泡排序

B. 直接插入排序

C. 快速排序

D. 归并排序

CSP 2019 提高级第一轮第 7 7 7

死记硬背的知识,选 C \mathtt{C} C

冒泡排序算法的伪代码如下:

输入:数组L, n ≥ k。输出:按非递减顺序排序的 L。

FLAG ← n //标记被交换的最后元素位置
while FLAG > 1 do
    k ← FLAG -1
    FLAG ← 1
   for j=1 to k do
        if L(j) > L(j+1) then do
             L(j)L(j+1)
             FLAG ← j

n n n 个数用以上冒泡排序算法进行排序,最少需要比较多少次?( )。

A. n 2 n^2 n2

B. n − 2 n-2 n2

C. n − 1 n-1 n1

D. n n n

CSP 2020 入门级第一轮第 5 5 5

对于冒泡排序而言,在处理有序数列的时候时间复杂度最优,那么,在如上代码中,考虑代入有序数列,那么,我们在第一次完成循环for j=1 to k do时,由于不会进行交换,所以 FLAG 的值此时为 1 1 1 ,退出循环

而针对这样一个循环,我们可以将for j=1 to k do改写成for j=1 to n-1 do,所以,选 C \mathtt{C} C

21. 哈希

一般来讲,会有两种方式考察哈希:判断哈希地址和选择哈希函数

这种题直接模拟两个小时随便嚯嚯

例题:

现有一个地址区间为 0 ∼ 10 0\sim 10 010 的哈希表,对于出现冲突情况,会往后找第一个空的地址存储 (到 10 10 10 冲突了就从 0 0 0 开始往后),现在要依次存储 ( 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 0,1,2,3,4,5,6,7 0,1,2,3,4,5,6,7),哈希函数为 h ( x ) = x 2   m o d   11 h(x)=x^{2} \bmod {11} h(x)=x2mod11。请问 7 7 7 存储在哈希表哪个地址中( )。

A. 5

B. 6

C. 7

D. 8

CSP 2021 提高级第一轮第 6 6 6

直接模拟:

第一个数为 0 0 0 ,代入哈希函数中进行计算: h ( 0 ) = 0 2   m o d   11 = 0 h(0)=0^{2} \bmod {11}=0 h(0)=02mod11=0 ,此时 Hash [   0   ] \text{Hash}[\ 0\ ] Hash[ 0 ] 为空,存入

第二个数为 1 1 1 ,代入哈希函数中进行计算: h ( 1 ) = 1 2   m o d   11 = 1 h(1)=1^{2} \bmod {11}=1 h(1)=12mod11=1 ,此时 Hash [   1   ] \text{Hash}[\ 1\ ] Hash[ 1 ] 为空,存入

第三个数为 2 2 2 ,代入哈希函数中进行计算: h ( 0 ) = 2 2   m o d   11 = 4 h(0)=2^{2} \bmod {11}=4 h(0)=22mod11=4 ,此时 Hash [   4   ] \text{Hash}[\ 4\ ] Hash[ 4 ] 为空,存入

第四个数为 3 3 3 ,代入哈希函数中进行计算: h ( 3 ) = 3 2   m o d   11 = 9 h(3)=3^{2} \bmod {11}=9 h(3)=32mod11=9 ,此时 Hash [   9   ] \text{Hash}[\ 9\ ] Hash[ 9 ] 为空,存入

第五个数为 4 4 4 ,代入哈希函数中进行计算: h ( 4 ) = 4 2   m o d   11 = 5 h(4)=4^{2} \bmod {11}=5 h(4)=42mod11=5 ,此时 Hash [   5   ] \text{Hash}[\ 5\ ] Hash[ 5 ] 为空,存入

第六个数为 5 5 5 ,代入哈希函数中进行计算: h ( 5 ) = 5 2   m o d   11 = 3 h(5)=5^{2} \bmod {11}=3 h(5)=52mod11=3 ,此时 Hash [   3   ] \text{Hash}[\ 3\ ] Hash[ 3 ] 为空,存入

第七个数为 6 6 6 ,代入哈希函数中进行计算: h ( 6 ) = 6 2   m o d   11 = 3 h(6)=6^{2} \bmod {11}=3 h(6)=62mod11=3 ,此时 Hash [   3   ] \text{Hash}[\ 3\ ] Hash[ 3 ] 不为空,产生冲突,寻找第一个空的地址,为 6 6 6 ,存入

第八个数为 7 7 7 ,代入哈希函数中进行计算: h ( 7 ) = 7 2   m o d   11 = 5 h(7)=7^{2} \bmod {11}=5 h(7)=72mod11=5 ,此时 Hash [   5   ] \text{Hash}[\ 5\ ] Hash[ 5 ] 不为空,产生冲突,寻找第一个空的地址,为 7 7 7 ,存入

综上,元素 7 7 7 存入了 Hash [   7   ] \text{Hash}[\ 7\ ] Hash[ 7 ] 中,选 C \mathtt{C} C

( 2 , 7 , 10 , 18 ) (2, 7, 10, 18) (2,7,10,18) 分别存储到某个地址区间为 0 ∼ 10 0\sim 10 010 的哈希表中,如果哈希函数 h ( x ) = ( ) h(x)=() h(x)=() ,将不会产生冲突,其中 a   m o d   b a \bmod b amodb 表示 a a a 除以 b b b 的余数。

A. x 2   m o d   11 x^2 \bmod{11} x2mod11

B. 2 x   m o d   11 2x \bmod{11} 2xmod11

C. x   m o d   11 x \bmod{11} xmod11

D. ⌊ x 2 ⌋   m o d   11 \lfloor \dfrac{x}{2} \rfloor \bmod{11} 2xmod11 ,其中 ⌊ x 2 ⌋ \lfloor \dfrac{x}{2} \rfloor 2x 表示 x 2 \dfrac{x}{2} 2x 下取整

CSP 2020 提高级第一轮第 5 5 5

直接模拟:

当选择 h ( x ) = x 2   m o d   11 h(x)=x^2 \bmod{11} h(x)=x2mod11

h ( 2 ) = 2 2   m o d   11 = 4   h ( 7 ) = 7 2   m o d   11 = 5   h ( 10 ) = 1 0 2   m o d   11 = 1   h ( 18 ) = 1 8 2   m o d   11 = 5 h(2)=2^2\bmod11=4\\\ \\h(7)=7^2\bmod11=5\\\ \\h(10)=10^2\bmod11=1\\\ \\h(18)=18^2\bmod11=5 h(2)=22mod11=4 h(7)=72mod11=5 h(10)=102mod11=1 h(18)=182mod11=5

产生冲突

当选择 h ( x ) = 2 x   m o d   11 h(x)=2x \bmod{11} h(x)=2xmod11

h ( 2 ) = 2 × 2   m o d   11 = 4   h ( 7 ) = 7 × 2   m o d   11 = 3   h ( 10 ) = 10 × 2   m o d   11 = 9   h ( 18 ) = 18 × 2   m o d   11 = 3 h(2)=2\times2\bmod11=4\\\ \\h(7)=7\times2\bmod11=3\\\ \\h(10)=10\times2\bmod11=9\\\ \\h(18)=18\times2\bmod11=3 h(2)=2×2mod11=4 h(7)=7×2mod11=3 h(10)=10×2mod11=9 h(18)=18×2mod11=3

产生冲突

当选择 h ( x ) = x   m o d   11 h(x)=x \bmod{11} h(x)=xmod11

h ( 2 ) = 2   m o d   11 = 2   h ( 7 ) = 7   m o d   11 = 7   h ( 10 ) = 10   m o d   11 = 10   h ( 18 ) = 18   m o d   11 = 7 h(2)=2\bmod11=2\\\ \\h(7)=7\bmod11=7\\\ \\h(10)=10\bmod11=10\\\ \\h(18)=18\bmod11=7 h(2)=2mod11=2 h(7)=7mod11=7 h(10)=10mod11=10 h(18)=18mod11=7

产生冲突

当选择 h ( x ) = ⌊ x 2 ⌋   m o d   11 h(x)=\lfloor \dfrac{x}{2} \rfloor \bmod{11} h(x)=2xmod11

h ( 2 ) = ⌊ 2 2 ⌋   m o d   11 = 1   h ( 7 ) = ⌊ 7 2 ⌋   m o d   11 = 3   h ( 10 ) = ⌊ 10 2 ⌋   m o d   11 = 5   h ( 18 ) = ⌊ 18 2 ⌋   m o d   11 = 9 h(2)=\lfloor \dfrac{2}{2} \rfloor \bmod{11}=1\\\ \\h(7)=\lfloor \dfrac{7}{2} \rfloor \bmod{11}=3\\\ \\h(10)=\lfloor \dfrac{10}{2} \rfloor \bmod{11}=5\\\ \\h(18)=\lfloor \dfrac{18}{2} \rfloor \bmod{11}=9 h(2)=22mod11=1 h(7)=27mod11=3 h(10)=210mod11=5 h(18)=218mod11=9

未产生冲突

综上,选 D \mathtt{D} D

22. 递归

最恶心的,没有之一

有些题只能模拟,别无他法(注意使用记忆化!

但是有些题,我们需要转化一下,以简化问题

例题:

有如下递归代码

solve(t, n):
	if t=1 return 1
   else return 5*solve(t-1,n) mod n

solve ( 23 , 23 ) \text{solve}(23,23) solve(23,23)的结果为( )。

A. 1

B. 7

C. 12

D. 22

CSP 2021 提高级第一轮第 11 11 11

这道题不需要直接模拟

观察这一段伪代码:

else return 5*solve(t-1,n) mod n

当我们完成当前递归之前的所有递归时,我们需要将结果经进行 × 5   %   23 \times5\ \%\ 23 ×5 % 23 的操作(由于 n n n 是不变的,现视为常量)

而对于当前递归的上一层递归而言,当我们完成当前递归之前的所有递归时,我们还是需要将结果经进行 × 5   %   23 \times5\ \%\ 23 ×5 % 23 的操作

所以,其结果相当于若干个 5 5 5 相乘在取模 23 23 23

那么,是几个 5 5 5 呢?

考虑整个递归,在 n ≠ 1 n\ne1 n=1的情况下,都会有 × 5 \times5 ×5 的操作

所以,会有 n − 1 n-1 n1 次乘法操作(只有最后一次没有),在这里, n = 23 n=23 n=23 ,所以有 22 22 22 次乘法操作

因此,现在只需求表达式 5 22   m o d   23 5^{22}\bmod23 522mod23 即可

5 22   m o d   23 = 2 5 11   m o d   23 = 2 11   m o d   23 = 16 × 2 × 16 × 2 × 8 ÷ 2 ÷ 2   m o d   23 = 32 × 32 × 2   m o d   23 = 9 × 9 × 2   m o d   23 = 162   m o d   23 = 1 \begin{aligned}5^{22}\bmod23&=25^{11}\bmod23\\&=2^{11}\bmod23\\&=16\times2\times16\times2\times8\div2\div2\bmod23\\&=32\times32\times2\bmod23\\&=9\times9\times2\bmod23\\&=162\bmod23\\&=1\end{aligned} 522mod23=2511mod23=211mod23=16×2×16×2×8÷2÷2mod23=32×32×2mod23=9×9×2mod23=162mod23=1

综上,选 A \mathtt{A} A

考虑如下递归算法

solve(n)  
    if n<=1 return 1  
    else if n>=5 return n*solve(n-2)  
    else return n*solve(n-1)  

则调用 solve ( 7 ) \text{solve}(7) solve(7) 得到的返回结果为( )。

A. 105

B. 840

C. 210

D. 420

CSP 2021 入门级第一轮第 13 13 13

这个不难,照着代码模拟即可

solve ( 7 ) = 7 × solve ( 5 ) = 7 × 5 × solve ( 3 ) = 35 × 3 × solve ( 2 ) = 105 × 2 × solve ( 1 ) = 210 \begin{aligned}\text{solve}(7)&=7\times\text{solve}(5)\\&=7\times5\times\text{solve}(3)\\&=35\times3\times\text{solve}(2)\\&=105\times2\times\text{solve}(1)\\&=210\end{aligned} solve(7)=7×solve(5)=7×5×solve(3)=35×3×solve(2)=105×2×solve(1)=210

C \mathtt{C} C

A A A n n n 个实数的数组,考虑下面的递归算法:

XYZ (A[1..n])
	if n=1 then return A[1]
	else temp ← XYZ (A[1..n-1])
	if temp < A[n]
	then return temp
	else return A[n]

请问算法 XYZ 的输出是什么?()

A. A 数组的平均值

B. A 数组的最小值

C. A 数组的中值

D. A 数组的最大值

CSP 2020 入门级第一轮第 6 6 6

首先,我们可以精简一下代码:

XYZ (A[1..n])
	if n=1 then return A[1]
	else temp ← XYZ (A[1..n-1])
	return min(temp,A[n])

考虑从简单入手,即先处理 n ≤ 3 n\le3 n3 的情况

n = 1 n=1 n=1 时,返回 A [   1   ] A[\ 1\ ] A[ 1 ]

n = 2 n=2 n=2 时, temp = XYZ ( A [   1   ] ) \text{temp}=\text{XYZ}(A[\ 1\ ]) temp=XYZ(A[ 1 ]) ,即 temp = A [   1   ] \text{temp}=A[\ 1\ ] temp=A[ 1 ] ,然后,返回 min ⁡ ( temp , A [   2   ] ) \min(\text{temp},A[\ 2\ ]) min(temp,A[ 2 ]) ,即 min ⁡ { A [   i   ] } ( i ∈ { 1 , 2 } ) \min\{A[\ i\ ]\}(i\in\{1,2\}) min{A[ i ]}(i{1,2})

n = 3 n=3 n=3 时, temp = XYZ ( A [   2   ] ) \text{temp}=\text{XYZ}(A[\ 2\ ]) temp=XYZ(A[ 2 ]) ,即 temp = min ⁡ { A [   i   ] } ( i ∈ { 1 , 2 } ) \text{temp}=\min\{A[\ i\ ]\}(i\in\{1,2\}) temp=min{A[ i ]}(i{1,2}) ,然后,返回 min ⁡ ( temp , A [   3   ] ) \min(\text{temp},A[\ 3\ ]) min(temp,A[ 3 ]) ,即 min ⁡ { A [   i   ] } ( i ∈ { 1 , 2 , 3 } ) \min\{A[\ i\ ]\}(i\in\{1,2,3\}) min{A[ i ]}(i{1,2,3})

综上可得, XYZ \text{XYZ} XYZ 所求为 A \text{A} A 数组的最小值,选 B \mathtt{B} B

23. 贪心

说到贪心,就不得不提及一个算法:霍夫曼编码

虽然我不知道啥是霍夫曼编码,但是只需要知道霍夫曼编码的本质是贪心即可

例题:

在数据压缩编码中的哈夫曼编码方法,在本质上是一种( )的策略。

A. 枚举

B. 贪心

C. 递归

D. 动态规划

CSP 2021 入门级第一轮第 11 11 11

死记硬背的知识,选 B \mathtt{B} B

以下哪些算法不属于贪心算法?()

A. Dijkstra 算法

B. Floyd 算法

C. Prim 算法

D. Kruskal 算法

CSP 2019 提高级第一轮第 13 13 13

选项 A \mathtt{A} A :每一次选取当前已知的点中最短路最短的点进行松弛,是贪心

选项 B \mathtt{B} B :通过对某一点的经过与否的讨论进行松弛,是DP

选项 C \mathtt{C} C :与 Dijkstra 算法类似,是贪心

选项 D \mathtt{D} D :每一次选取不会形成环的最短边,是贪心

C \mathtt{C} C

下列哪些问题不能用贪心法精确求解?( )

A. 霍夫曼编码问题

B. 0-1 背包问题

C. 最小生成树问题

D. 单源最短路径问题

CSP 2020 提高级第一轮第 6 6 6

选项 A \mathtt{A} A :死记硬背的知识,可用贪心

选项 B \mathtt{B} B :通过对某一物品的选与不选的讨论进行求解,不可用贪心

选项 C \mathtt{C} C :可用贪心(Kruskal)

选项 D \mathtt{D} D :可用贪心(Dijkstra)

B \mathtt{B} B

24. 图论

图论基本上已经讲完,剩下的知识一点简单东西

直接看例题:

有如下的有向图,节点为 A , B , ⋯   , J A ,B , \cdots , J A,B,,J 其中每条边的长度都标在图中。则节点 A A A 到节点 J J J 的最短路径长度为( )。

A. 16

B. 19

C. 20

D. 22

CSP 2021 提高级第一轮第 15 15 15

直接模拟最短算法即可(下图中结点数值表示该点到 A A A 点的最短路)

在这里插入图片描述

第一次松弛后:

在这里插入图片描述

第二次松弛后:

在这里插入图片描述

第三次松弛后,图没有改变

第四次松弛后:

在这里插入图片描述
第五次松弛后:

在这里插入图片描述

第六次松弛后:

在这里插入图片描述

第七次松弛后:

在这里插入图片描述

第八次松弛后:

在这里插入图片描述

第九次和第十次松弛后,图没有改变

综上,选 B \mathtt{B} B

对一个 n n n 个顶点, m m m 条边的带权有向简单图用 Dijkstra 算法计算单源最短路时,如果不使用堆或其它优先队列进行优化,则其时间复杂度为( )。

A. O ( ( m + n 2 ) log ⁡ n ) O((m + n^2) \log n) O((m+n2)logn)

B. O ( m n + n 3 ) O(mn + n^3) O(mn+n3)

C. O ( ( m + n ) log ⁡ n ) O((m + n) \log n) O((m+n)logn)

D. O ( n 2 ) O(n^2) O(n2)

CSP 2020 提高级第一轮第 14 14 14

众所周知,没有优化的 Dijkstra 算法最外层有一个 O ( n ) O(n) O(n) 的循环,表示至少进行 n n n 次操作,在循环里面,还有两个 O ( n ) O(n) O(n) 的循环,分别用来寻找当前已知的点中最短路最短的点以及松弛操作,怼一起,时间复杂度为 O ( n 2 ) O(n^2) O(n2) ,选 D \mathtt{D} D

以下哪个结构可以用来存储图()

A. 栈

B. 二叉树

C. 队列

D. 邻接矩阵

CSP 2019 提高级第一轮第 12 12 12

死记硬背的知识,选 D \mathtt{D} D

a a a 为起点,对下边的无向图进行深度优先遍历,则 b , c , d , e b,c,d,e b,c,d,e 四个点中有可能作为最后一个遍历到的点的个数为( )。

A. 1

B. 2

C. 3

D. 4

CSP 2021 入门级第一轮第 14 14 14

a a a 为起点,接下来,可以去 b b b ,也可以去 c c c

在这里插入图片描述

如果去 b b b ,那么只要一种遍历情况

在这里插入图片描述

如果去 c c c ,那么到达 c c c 时,可以去 d d d ,也可以去 e e e

在这里插入图片描述

分别将两种情况讨论一下

在这里插入图片描述

综上,只有 b , e b,e b,e 两点可能为最后一个遍历到的点,故选 B \mathtt{B} B

写到这里就差不多了,有机会(指可以尽快完成暑假作业)看再写点什么

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值