CCF编程能力等级认证GESP—C++1级真题
- 单选题(每题 2 分,共 30 分)
- 判断题(每题 2 分,共 20 分)
- 编程题 (每题 25 分,共 50 分)
- 小杨寻宝
- 矩阵移动
单选题(每题 2 分,共 30 分)
1、已知小写字母 b 的ASCII码为98,下列C++代码的输出结果是( )。
#include <iostream>
using namespace std;
int main() {
char a = 'b';
a++;
cout << a;
return 0;
}
A. b
B. c
C. 98
D. 99
正确答案:B
2、已知 a 为 int 类型变量,下列表达式不符合语法的是( )。
A. &a + 3
B. +a & 3
C. a - - 4
D. a++3
正确答案:D
3、下列关于C++语言中指针的叙述,不正确的是( )。
A. 指针变量中存储的是内存地址。
B. 指针变量指向的内存地址不一定能够合法访问。
C. 结构类型中的指针成员不能指向该结构类型。
D. 定义指针变量时必须指定其指向的类型。
正确答案:C
4、下列关于C++类的说法,错误的是( )。
A. 将C++类对象通过值传递给函数参数时,会自动调用复制构造函数。
B. 将一个类的对象赋值给该类的另一个对象时,不会自动调用构造函数。 C. 定义C++类对象时,一定会调用默认构造函数。
D. 构造派生类的对象时,一定会调用基类的构造函数。
正确答案:C
5、某二叉树T的先序遍历序列为:{A B D C E G H F},中序遍历序列为:{D B A H G E C F},则下列说法中正 确的是( )。
A. T的高为5
B. T有4个叶节点
C. T是平衡树
D. 以上说法都不对
正确答案:A
6、一棵完全二叉树有431个结点,则叶结点有多少个?( )
A. 176
B. 215
C. 216
D. 255
正确答案:C
7、下列关于树的说法,错误的是( )。
A. 二叉树的中序遍历与其深度优先遍历总是相同的。
B. 所有树都可以构造一颗二叉树与之一一对应。
C. 如果树的一个叶结点有两个不同的祖先结点,那么其中一个一定是另一个的祖先结点。
D. 树的结点不能有两个父结点。
正确答案:A
8、一个简单无向图有10个结点、30条边。再增加多少条边可以成为完全图。( )
A. 10
B. 15
C. 51
D. 60
正确答案:B
9、以下哪个方案可以合理解决或缓解哈希表冲突( )。
A. 丢弃发生冲突的新元素。
B. 用新元素覆盖发生冲突的元素。
C. 用新元素覆盖在冲突位置的下一个位置。
D. 将新元素放置在冲突位置之后的第一个空位。
正确答案:D
10、一个迷宫,已知从起点不经过重复结点到达终点的路径有且仅有一条,则下面说法错误的是( )。
A. 可以使用深度优先搜索找到这条路径。
B. 可以使用广度优先搜索找到这条路径。
C. 该迷宫内与起点连通的结点,一定也与终点连通。
D. 该迷宫内与起点连通的结点及它们之间的路径可以抽象为无向无环图。
正确答案:D
11、下面程序的输出为( )。
#include <iostream>
#include <cmath>
using namespace std;
int main() {
cout << (int)log(8) << endl;
return 0;
}
A. 2
B. 3
C. 8
D. 无法通过编译。
正确答案:A
12、下面程序的输出为( )。
#include <iostream>
#define N 10
using namespace std;
int path[N][N];
int main() {
for (int i = 1; i < N; i++)
path[i][0] = i;
for (int j = 1; j < N; j++)
path[0][j] = j;
for (int i = 1; i < N; i++)
for (int j = 1; j < N; j++)
path[i][j] = path[i - 1][j] + path[i][j - 1];
cout << path[8][4] << endl;
return 0; }
A. 84
B. 495
C. 1012
D. 结果是随机的。
正确答案:C
13、上题中程序的时间复杂度为( )。
A. O ( 1 ) O(1) O(1)
B. O ( N ) O(N) O(N)
C. O ( N l o g N ) O(NlogN) O(NlogN)
D. O ( N 2 ) O(N^2) O(N2)
正确答案:D
14、下面 fib 函数的时间复杂度为( )。
int fib_rcd[MAX_N];
int fib(int n){
if(n<=1)
return 1;
if (fib_rcd[n] > 0)
return fib_rcd[n];
return fib(n - 1) + fib(n - 2);
}
A. O ( n ) O(n) O(n)
B. O ( ϕ n ) , ϕ = 5 − 1 2 O(\phi^n), \phi = \frac{\sqrt{5} - 1}{2} O(ϕn),ϕ=25−1
C. O ( 2 n ) O(2^n) O(2n)
D. 无法正常结束
正确答案:B
15、下列选项中,哪个可能是下图的广度优先遍历序列( )。
A. 1, 3, 5, 7, 4, 2, 6, 8, 9
B. 9, 4, 2, 1, 3, 7, 5, 6, 8
C. 1, 3, 5, 7, 6, 8, 9, 4, 2
D. 9, 4, 7, 2, 1, 3, 5, 6, 8
正确答案:A
判断题(每题 2 分,共 20 分)
1、表达式’a’ << 1的结果为’a '。
正确答案:错误
2、在C++语言中,函数可以定义在另一个函数定义之内。
正确答案:错误
3、选择排序一般是不稳定的。
正确答案:正确
4、埃氏筛法和欧拉筛法都是使用筛法思想生成素数表的算法,欧拉筛法的时间复杂度更低。
正确答案:正确
5、使用 math.h 或 cmath 头文件中的正弦函数,表达式 sin(30) 的结果类型为 double 、值约为 0.5 。
正确答案:错误
6、一颗N层的完全二叉树,一定有 2 N 2^N 2N个结点。
正确答案:错误
7、一个图,不管是否连通,都可以使用深度优先搜索算法进行遍历。
正确答案:正确
8、某个哈希表键值 x 为整数, H(x) = x % p 是常用的哈希函数之一,要求 p 选择素数是因为这样不会产生 冲突。( )
正确答案:错误
9、使用单链表实现队列时,链表头结点作为队首比链表头结点作为队尾更便于操作。
正确答案:正确
10、一个图中,每个结点表达一个人,连接两个结点的边表达两个结点对应的人相互认识,则这个图可以用来
表达社交网络。
正确答案:正确
编程题 (每题 25 分,共 50 分)
小杨寻宝
【问题描述】
小杨有一棵包含n个节点的树,树上的一些节点放置有宝物。
小杨可以任意选择一个节点作为起点并在树上移动,但是小杨只能经过每条边至多一次,当小杨经过一条边后,这条边就会消失。小杨每经过一个放置有宝物的节点就会取得该宝物。
小杨想请你帮他判断自己能否成功取得所有宝物。
【输入描述】
第一行包含一个正整数t,代表测试用例组数。
接下来是t组测试用例。对于每组测试用例,一共n + 1行
第一行包含一个正整数n,代表树的节点数。
第二行包含n个非负整数
a
1
,
a
2
,
.
.
.
,
a
n
a_1, a_2, ..., a_n
a1,a2,...,an,其中如果
a
i
=
1
a_i = 1
ai=1,则节点i放置有宝物,若
a
i
=
0
a_i = 0
ai=0,则节点i没有宝物
之后n - 1行,每行包含两个正整数
x
i
,
y
i
x_i, y_i
xi,yi,代表存在一条连接节点
x
i
x_i
xi和
y
i
y_i
yi的边。
【输出描述】
对于每组测试数据,如果小杨能成功取得所有宝物,输出 Yes,否则输出 No。
【样例输入 1】
2
5
0 1 0 1 0
1 2
1 3
3 4
3 5
5
1 1 1 1 1
1 2
1 3
3 4
3 5
【样例输出 1】
Yes
No
对于第一组测试用例,小杨从节点2出发,按照2 - 1 - 3 - 4的顺序即可成功取得所有宝物。
子任务编号 | 数据点占比 | t | n |
---|---|---|---|
1 | 20% | < = 10 <= 10 <=10 | < = 5 <= 5 <=5 |
2 | 20% | < = 10 <= 10 <=10 | < = 1000 <= 1000 <=1000 |
3 | 60% | < = 10 <= 10 <=10 | < = 1 0 5 <= 10^5 <=105 |
对于全部数据,保证有 1 < = t < = 10 , 1 < = n < = 1 0 5 , 0 < = a i < = 1 1 <= t <= 10, 1 <= n <= 10^5, 0 <= a_i <= 1 1<=t<=10,1<=n<=105,0<=ai<=1,且保证树上一定有至少一个节点放置有宝物。
矩阵移动
【问题描述】
小杨有一个有一个
n
∗
m
n * m
n∗m的矩阵,仅包含 01? 三种字符。矩阵的行从上到下编号依次为1,2,…,n,列从左到右编号依次为1,2,…,m编号。小杨开始在矩阵的左上角(1,1),小杨只能向下或者向右移动,最终到达右下角(n,m) 时停止,在移动的过程中每经过一个字符 1 得分会增加一分(包括起点和终点),经过其它字符则分数不变。小杨 的初始分数为0分。
小杨可以将矩阵中不超过x个字符 ? 变为字符 1。小杨在修改矩阵后,会以最优的策略从左上角移动到右下角。他想 知道自己最多能获得多少分。
【输入描述】
第一行包含一个正整数t,代表测试用例组数。
接下来是t组测试用例。对于每组测试用例,一共n + 1行。
第一行包含三个正整数n,m,x,含义如题面所示。
之后n行,每行包含一个长度为m且仅包含 01? 三种字符的字符串。
【输出描述】
对于每组测试用例,输出一行一个整数,代表最优策略下小杨的得分最多是多少。
【样例输入 1】
2
3 3 1
000
111
01?
3 3 1
000
?0?
01?
【样例输出 1】
4
2
对于第二组测试用例,将(1,1)或者(3,3)变成1均是最优策略。
子任务编号 | 数据点占比 | t | n,m | x |
---|---|---|---|---|
1 | 30% | < = 5 <= 5 <=5 | < = 10 <= 10 <=10 | =1 |
2 | 30% | < = 10 <= 10 <=10 | < = 500 <= 500 <=500 | < = 30 <= 30 <=30 |
3 | 40% | < = 10 <= 10 <=10 | < = 500 <= 500 <=500 | < = 300 <= 300 <=300 |
对于全部数据,保证有 1 < = t < = 10 , 1 < = n , m < = 500 , 1 < = x < = 300 1 <= t <= 10, 1 <= n,m <= 500, 1 <= x <= 300 1<=t<=10,1<=n,m<=500,1<=x<=300,同时保证所有测试用例n * m的总和不超过 2.5 ∗ 1 0 5 2.5 * 10^5 2.5∗105。