CCF编程能力等级认证GESP—C++6级—20231209
- 单选题(每题 2 分,共 30 分)
- 判断题(每题 2 分,共 20 分)
- 编程题 (每题 25 分,共 50 分)
- 闯关游戏
- 工作沟通
- 答案及解析
- 单选题
- 判断题
- 编程题1
- 编程题2
单选题(每题 2 分,共 30 分)
1、关于C++类和对象的说法,错误的是( )。
A. 在C++中,一切皆对象,即便是字面量如整数5等也是对象
B. 在C++中,可以自定义新的类,并实例化为新的对象
C. 在C++中,内置函数和自定义函数,都是类或者对象
D. 在C++中,可以在自定义函数中嵌套定义新的函数
2、有关下面C++代码的说法,错误的是( )。
class Rectangle{
private:
class Point{
public:
double x;
double y;
};
Point a, b, c, d;
double length;
double width;
public:
A. C++中类内部可以嵌套定义类
B. 在类中定义的类被称为内部类,定义类的类被称为外部类
C. 内部类可以随便访问,不需要通过外部类来访问
D. 代码中 Point 被称为内部类,可以通过外部类 Rectangle 来访问, Rectangle::Point
3、有关下面C++代码的说法,正确的是( )。
using namespace std;
class newClass{
public:
static int objCounter;
};
int newClass::objCounter = 2;
int main() {
newClass classA;
newClass classB;
cout << newClass::objCounter << endl;
cout << classB.objCounter << endl;
}
A. 第14行代码错误,第15行正确
B. 第15行代码错误,第14行代码正确
C. 第14、15两行代码都正确
D. 第6行代码可修改为 objCounter += 1
4、有关下面C++代码的说法,错误的是( )。
struct BiNode{
char data;
BiNode* lchid, *rchid;
};
class BiTree{
private:
BiNode* Creat();
void Release(BiNode* bt);
BiNode* root;
public:
BiTree(){
root = Creat();
}
~BiTree(){
Release(root);
A. 上列C++代码适用于构造各种二叉树
B. 代码 struct BiNode 用于构造二叉树的节点
C. 代码 BiTree(){root=Creat();} 用于构造二叉树
D. 析构函数不可以省略
5、基于第4题的定义,有关下面C++代码的说法正确的是( )。
void Order(BiNode* bt){
if (bt == nullptr)
return;
else{
cout << bt->data;
Order(bt->lchid);
Order(bt->rchid);
}
}
A. 代码中 Order( ) 函数是中序遍历二叉树的方法
B. 代码中 Order( ) 先访问根节点,然后对左子树进行前序遍历,再对右子树前序遍历
C. 代码中 Order( ) 先访问中序遍历左子树,然后访问根节点,最后则是中序遍历右子树
D. 代码中 Order( ) 先后序遍历左子树,然后后序遍历右子树,最后访问根节点
6、有关下面C++代码的说法正确的是( )。
typedef struct LinkList{
int data;
LinkList* next;
LinkList* prev;
}LinkList, LinkNode;
bool ListInit(LinkList* &L){
L = new LinkNode;
if (!L) return false;
L->next = NULL;
L->prev = NULL;
L->data = -1;
return true;
}
A. 上述代码构成单向链表
B. 上述代码构成双向链表
C. 上述代码构成循环链表
D. 上述代码构成指针链表
7、对 hello world 使用霍夫曼编码(Huffman Coding),最少bit(比特)为( )。
A. 4
B. 32
C. 64
D. 88
8、下面的 fiboA() 和 fiboB() 两个函数分别实现斐波那契数列,该数列第1、第2项值为1,其余各项分别为前两项之和。下面有关说法错误的是( )。
int fiboA(int n){
if (n == 0)
return 1;
if (n == 1)
return 1;
else{
return fiboA(n - 1) + fiboA(n - 2);
}
}
int fiboB(int n){
if ((n == 0) || (n == 1)){
fiboB[n] = n;
return n;
}else{
if (fiboB[n] == 0){
fiboB[n] = FiboB(n - 1) + FiboB(n - 2);
}
return fiboB[n];
}
}
A. fiboA() 采用递归方式实现斐波那契数列
B. fiboB() 采用动态规划算法实现斐波那契数列
C. 当N值较大时, fiboA() 存在大量重复计算
D. 由于 fiboA() 代码较短,其执行效率较高
9、有关下面C++代码不正确的说法是( )。
int Depth(BiTree T){
if (T == NULL){
return 0;
}else{
int m = Depth(T->lchild);
int n = Depth(T->rchild);
if(m > n){
return m + 1;
}else{
return n + 1;
}
}
}
A. 该代码可用于求解二叉树的深度
B. 代码中函数 Depth( ) 的参数 T 表示根节点,非根节点不可以作为参数
C. 代码中函数 Depth( ) 采用了递归方法
D. 代码中函数 Depth( ) 可用于求解各种形式的二叉树深度,要求该二叉树节点至少有 left 和 right 属性
10、下面有关树的存储,错误的是( ).
A. 完全二叉树可以用 list 存储
B. 一般二叉树都可以用 list 存储,空子树位置可以用 None 表示
C. 满二叉树可以用 list 存储
D. 树数据结构,都可以用 list 存储
11、构造二叉树 [1,2,3,null,4] ( )。
A. 1(2()(4))(3)
B. 1(2(3)())(4)
C. (1,2(3),(4))
D. (1,(2)(3),(4))
12、下面有关布尔类型的函数的说法,正确的是( )。
A. bool 类型函数只能返回0或者1两种值
B. bool 类型函数可以返回任何整数值
C. bool 类型函数必须有参数传递
D. bool 类型函数没有返回值
13、通讯卫星在通信网络系统中主要起到( )的作用。
A. 信息过滤
B. 信号中继
C. 避免攻击
D. 数据加密
14、小杨想编写一个判断任意输入的整数N是否为素数的程序,下面哪个方法不合适?( )
A. 埃氏筛法
B. 线性筛法
C. 二分答案
D. 枚举法
15、内排序有不同的类别,下面哪种排序算法和冒泡排序是同一类?( )
A. 希尔排序
B. 快速排序
C. 堆排序
D. 插入排序
判断题(每题 2 分,共 20 分)
1、 在面向对象中,方法在C++的class中表现为class内定义的函数。( )
2、C++类的定义中,可以没有构造函数,会给出默认的构造函数( )
3、如果某个C++对象(object)支持下标运算符(方括号运算符),则该对象在所对应class中以成员函数的形式进行了重载。( )
4、 深度优先搜索(DFS,Depth First Search的简写)属于图算法,其过程是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。( )
5、 哈夫曼编码(Huffman Coding)具有唯一性,因此有确定的压缩率。 ( )
6、在下面C++代码中,由于删除了变量 ptr ,因此 ptr 所对应的数据也随之删除,故第8行代码被执行时,将报错。( )
int * ptr = new int(10);
cout << *ptr << endl;
delete ptr;
cout << *ptr << endl;
7、 二叉搜索树查找的平均时间复杂度为 O(logN)。( )
8、二叉搜索树可以是空树(没有任何节点)或者单节点树(只有一个节点),或者多节点。如果是多节点,则左节点的值小于父节点的值,右节点的值大于父节点的值,由此推理,右节点树的值都大于根节点的值,左节点树的值都小于根节点的值。( )
9、 小杨想写一个程序来算出正整数N有多少个因数,经过思考他写出了一个重复没有超过N/2次的循环就能够算出来了。( )
10、同样的整数序列分别保存在单链表和双向链中,这两种链表上的简单冒泡排序的复杂度相同。( )
编程题 (每题 25 分,共 50 分)
闯关游戏
【问题描述】
你来到了一个闯关游戏。
这个游戏总共有 N 关,每关都有 M 个通道,你需要选择一个通道并通往后续关卡。其中,第 i 个通道可以让你前进 a 关,也就是说,如果你现在在第 x 关,那么选择第 i 个通道后,你将直接来到第x + ai 关(特别地,如果x + ai >= N,那么你就通关了)。此外,当你顺利离开第 s 关时,你还将获得 bs 分。
游戏开始时,你在第 0 关。请问,你通关时最多能获得多少总分?
【输入描述】
第一行两个整数N ,M分别表示关卡数量和每关的通道数量。
接下来一行 M 个用单个空格隔开的整数
a
0
,
a
1
,
.
.
.
,
a
M
−
1
a_0,a_1,...,a_{M-1}
a0,a1,...,aM−1 。保证 1 <= ai <= N。
接下来一行 N 个用单个空格隔开的整数
b
0
,
b
1
,
.
.
.
,
b
N
−
1
b_0,b_1,...,b_{N-1}
b0,b1,...,bN−1 。保证
∣
b
i
∣
<
=
1
0
5
|b_i| <= 10^5
∣bi∣<=105 。
【输出描述】
一行一个整数,表示你通关时最多能够获得的分数。
【特别提醒】
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
【样例输入 1】
6 2
2 3
1 0 30 100 30 30
【样例输出 1】
131
【样例解释 1】
你可以在第0 关选择第1 个通道,获得1 分并来到第3 关;随后再选择第0 个通道,获得100 分并来到第5 关;最后任选一个通道,都可以获得30 分并通关。如此,总得分为 1 + 100 + 30 = 131。
【样例输入 2】
6 2
2 3
1 0 30 100 30 -1
【样例输出 2】
101
【样例解释 1】
请注意,一些关卡的得分可能是负数。
【数据规模】
对于20%的测试点,保证M = 1 。
对于40%的测试点,保证N <= 20 ;保证M <= 2 。
对于所有测试点,保证N <=
1
0
4
10^4
104 ;保证M <= 100 。
工作沟通
【问题描述】
某公司有N 名员工,编号从0 至N-1 。其中,除了0 号员工是老板,其余每名员工都有一个直接领导。我们假设编号为i 的员工的直接领导是fi 。
该公司有严格的管理制度,每位员工只能受到本人或本人直接领导或间接领导的管理。具体来说,规定员工x 可以管理员工y ,当且仅当x = y ,或x = fy ,或x 可以管理fy 。特别地, 0号员工老板只能自我管理,无法由其他任何员工管理。
现在,有一些同事要开展合作,他们希望找到一位同事来主持这场合作,这位同事必须能够管理参与合作的所有同
事。如果有多名满足这一条件的员工,他们希望找到编号最大的员工。你能帮帮他们吗?
【输入描述】
第一行一个整数N ,表示员工的数量。
第二行N - 1 个用空格隔开的正整数,依次为f1,f2,…,fN-1 。
第三行一个整数Q ,表示共有Q 场合作需要安排。
接下来Q 行,每行描述一场合作:开头是一个整数 m(2<=m<=N ),表示参与本次合作的员工数量;接着是m个整数,依次表示参与本次合作的员工编号(保证编号合法且不重复)。
保证公司结构合法,即不存在任意一名员工,其本人是自己的直接或间接领导。
【输出描述】
输出 Q行,每行一个整数,依次为每场合作的主持人选。
【特别提醒】
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
【样例输入 1】
5
0 0 2 2
3
2 3 4
3 2 3 4
2 1 4
【样例输出 1】
2
2
0
【样例解释 1】
对于第一场合作,员工3,4 有共同领导2 ,可以主持合作。
对于第二场合作,员工2 本人即可以管理所有参与者。
对于第三场合作,只有0 号老板才能管理所有员工。
【样例输入 2】
7
0 1 0 2 1 2
5
2 4 6
2 4 5
3 4 5 6
4 2 4 5 6
2 3 4
【样例输出 2】
2
1
1
1
0
【数据规模】
对于50%的测试点,保证N <= 50 。
对于所有测试点,保证3 <= N <= 300 ;Q <= 100 。
答案及解析
单选题
1、
【答案】D
【考纲知识点】语法知识点
【解析】自定义函数中不能嵌套定义新函数。
2、
【答案】C
【考纲知识点】语法知识点
【解析】内部类是需要通过外部类访问的。
3、
【答案】C
【考纲知识点】语法知识点
【解析】objCounter 是静态成员,2 种方式都可以访问。
4、
【答案】D
【考纲知识点】语法知识点
【解析】析构函数可以省略。系统可以默认一个析构函数。
5、
【答案】B
【考纲知识点】数据结构知识点
【解析】对二叉树的先序遍历,根左右。
6、
【答案】B
【考纲知识点】数据结构知识点
【解析】实现一个链表,指向前面和后面的元素。
7、
【答案】B
【考纲知识点】数据结构知识点
【解析】赫夫曼编码。按照出现次数进行赫夫曼编码,如下图。共32bit。
8、
【答案】D
【考纲知识点】算法知识点
【解析】fiboA 函数会存在重复计算,执行效率不高。
9、
【答案】B
【考纲知识点】数据结构知识点
【解析】左右孩子也可以作为参数,不一定只有根节点。
10、
【答案】D
【考纲知识点】数据结构知识点
【解析】完全二叉树和满二叉树的节点下标是连续的,其他类型的节点数不确定,下标不一定连续,就不宜用 list 存储。
11、
【答案】A
【考纲知识点】数据结构知识点
【解析】构造二叉树,用括号表示法。1 是根结点,其左右孩子为2,3,写成1(2)(3)。用同样的思路构建左子树和右子树,选 A。
12、
【答案】A
【考纲知识点】语言函数知识点
【解析】bool 类型函数只能返回布尔类型,布尔值只有0 或者1。
13、
【答案】B
【考纲知识点】计算机基础知识
【解析】本题考察计算机基础知识。通信卫星可以转发无线电信号,实现通信地球站间或地球站与航天器间的无线电通信,因此具有信号中继作用。选B。
14、
【答案】C
【考纲知识点】数学知识
【解析】本题考察数学知识。线筛和埃筛都可以判断素数,枚举也可以,二分规模减半,不能合理判断。
15、
【答案】B
【考纲知识点】排序知识
【解析】冒泡排序和快速排序,都属于交换排序。
交换排序:冒泡排序、快速排序
选择排序:简单选择排序、堆排序
插入排序:直接插入排序、希尔排序
归并排序
基数排序
判断题
1、
【答案】正确
【考纲知识点】c++语言知识
【解析】方法在 c++中也就是类内的函数。
2、
【答案】正确
【考纲知识点】c++语言知识
【解析】构造函数没有,系统会给一个默认的构造函数。
3、
【答案】正确
【考纲知识点】c++语言知识
【解析】标准库类型 vector 和 string 都重载了下标运算符。
4、
【答案】正确
【考纲知识点】算法知识
【解析】深搜就是“能深则深、不能深则退”。
5、
【答案】错误
【考纲知识点】算法知识
【解析】哈夫曼编码确实是唯一的。但是,这并不意味着它总是有确定的压缩率。压缩率通常定义为压缩后数据大小与原始数据大小的比值。对于哈夫曼编码来说,压缩率会受到输入数据的特性(如字符频率分布)的影响。不同的输入数据,即使使用相同的哈夫曼编码算法,也可能得到不同的压缩率。
6、
【答案】错误
【考纲知识点】语法知识
【解析】一个指针的指向对象已被删除,那么就成了悬空指针。指针本身仍然存在,但它的指向变得不确定,因为原来的内存已经被释放并可能被重新分配给其他用途。可能会导致程序崩溃,但是可能正常执行。
7、
【答案】正确
【考纲知识点】数据结构知识
【解析】若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。平均情况下是一分为二。
8、
【答案】正确
【考纲知识点】数据结构知识
【解析】若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。平均情况下是一分为二。
9、
【答案】正确
【考纲知识点】算法知识
【解析】可以的。N 除了自身,只能有 1 个大于等于n/2 的因子。
10、
【答案】正确
【考纲知识点】算法知识
【解析】都是相邻的数字交换。
编程题1
1、
【题目大意】从 0 关出发,每次都有 m 种选择,选的的第i 个关卡,到达的下一个关卡是 0+ mi。当关卡的总和大于等于 N 的时候,便停止游戏。注意,离开第 i 个关卡,可以获得关卡的分数。
【考纲知识点】循环知识,动态规划
【解题思路】可以考虑动态规划。每关都是一个阶段,每关增加的都是一个正数,关数增加是单向的。保存好某个阶段的状态,因为是离开才能获得分数,因此不能加上当前关卡的分数。可求出所有阶段的最值,因为可能存在某关是负值,要求出所有状态的最大值。
编程题2
2、
【题目大意】0 号是老板,一个人可以管理自己,管理直接下属,管理下属的下属。可以根据关系建立起树结构。现在要求有 m 个人自己组织会议,要找一个人主持会议。如果 m 个人中能主持就从 m 个人中选,不能就找上级领导,有多个选择,就求出最大的编号。注意,参会和主持的角色不一样。
【考纲知识点】循环知识,树结构,深搜,有根树
【解题思路】首先要建立树结构,根据父子关系,求出节点的结构,并求出对应的层数。针对每次查询,先看一下 m 个人中,层数最低的能不能主持会议,不能就从上级中选取,结果最小就是 0 号来主持。注意,要编号最大的,因此在筛选的时候从大到小去筛选。根据层中的第 i 个节点去判断能否访问到m中的每个孩子,如果是,那就可以主持。假设 3 和 1 都符合,也在同一层,但是倒序查找,找到 3 就退出了。符合最终答案。