CCF编程能力等级认证GESP—C++7级—20240316

单选题(每题 2 分,共 30 分)

1、下列关于排序的说法,正确的是( )。

A. 冒泡排序是最快的排序算法之一。
B. 快速排序通常是不稳定的。
C. 最差情况, 个元素做归并排序的时间复杂度为 。 
D. 以上均不正确。

2、下面的程序属于哪种算法( )。

int pos[8];
void queen(int n) {
    for (int i = 0; i < 8; i++) {
        pos[n] = i;
		bool attacked = false; 
		for(intj=0;j<n;j++)
            if (pos[n] == pos[j] || pos[n] + n == pos[j] + j || pos[n] - n == pos[j] - j){
                attacked = true;
				break; 
			}
		if (attacked) 
			continue; 
		if(n==7){
			return; 
		}else{
            queen(n + 1);
        }
	} 
}
A. 贪心算法
B. 动态规划
C. 深度优先搜索 
D. 广度优先搜索

3、下面有关C++类的说法,错误的是( )。

A. C++类对象销毁时,会执行析构函数。
B. C++类可以通过定义构造函数实现自动类型转换。
C. C++类可以通过重载 [] 运算符实现通过给定下标访问数组成员的元素。 
D. C++类可以包含任意类型的成员变量。

4、一个连通的简单无向图,共有28条边,则该图至少有( )个顶点。

A. 6
B. 7 
C. 8 
D. 9

5、以下哪个方案不能合理解决或缓解哈希表冲突( )。

A. 在每个哈希表项处,使用单链表管理该表项的冲突元素。
B. 建立额外的单链表,用来管理所有发生冲突的元素。
C. 使用不同的哈希函数再建立一个哈希表,用来管理所有发生冲突的元素。 
D. 用新元素覆盖发生冲突的哈希表项。

6、已知一颗二叉树的中序遍历序列为:{C F B A E D G},后序遍历序列为:{F C B E G D A},则下列说法中正 确的是( )。

A. 该树是平衡二叉树。 
B. 该树的高为4。
C. 该树有4个叶节点。 
D. 以上说法都不对。

7、以下关于二叉排序树的说法,正确的是( )。

A. 二叉排序树的中序遍历序列一定是有序的。
B. 在含 n 个节点的二叉排序树中查找元素,最差情况的时间复杂度为 。 
C. 二叉排序树一定是二叉平衡树。
D. 以上说法都不对。

8、已知 x 为 double 类型的变量,且值大于0,则下列表达式的值一定大于0的是( )。

A. sin(x) / x
B. exp(x) - x 
C. log(x) - x 
D. x * x - x

9、一个简单有向图有10个结点、30条边。再增加多少条边可以成为完全图。( )

A. 60
B. 70 
C. 15 
D. 20

10、下列选项中,哪个可能是下图的深度优先遍历序列( )。

在这里插入图片描述

A. 8, 6, 1, 5, 3, 4, 2, 10, 7, 12, 11, 9 
B. 7, 8, 6, 4, 2, 1, 5, 3, 12, 9, 11, 10。 
C. 8, 10, 12, 9, 11, 4, 5, 3, 2, 1, 6, 7 
D. 7, 8, 10, 9, 11, 12, 4, 5, 1, 2, 3, 6

11、下面 schedule 函数的时间复杂度为( )。

#include <algorithm>
using namespace std;
struct activity {
    int id, start, end;
};
bool compare(activity a, activity b) {
    return a.end < b.end;
}
int schedule(int n, activity * p) {
    sort(p, p + n, compare);
    int cnt = 0, end = 0;
    for (int i = 0; i < n; i++) {
        if (p[i].start >= end) {
            end = p[i].end;
			cnt++; 
		}
	}
	return cnt; 
}

A. O ( n ) O(n) O(n)
B. O ( l o g ( n ) ) O(log(n)) O(log(n))
C. O ( n l o g ( n ) ) O(nlog(n)) O(nlog(n))
D. O ( n 2 ) O(n^2) O(n2)

12、下面 search 函数的平均时间复杂度为( )。

int search(int n, int * p, int target) {
	int low=0,high=n;
	while (low <= high) {
		int middle = (low + high) / 2;
		if (target == p[middle]) {
			return middle;
		} else if (target > p[middle]) {
			low = middle + 1;
		} else {
			high = middle - 1;
		}
	}
	return -1;
}

A. O ( n ) O(n) O(n)
B. O ( l o g ( n ) ) O(log(n)) O(log(n))
C. O ( 1 ) O(1) O(1)
D.可能无法返回

13、下面 count_triple 函数的时间复杂度为( )。

int count_triple(int n) {
    int cnt = 0;
	for (int a = 1; a <= n; a++)
	    for (int b = a; a + b <= n; b++)
	        for (int c = b; a + b + c <= n; c++)
	            if (a * a + b * b == c * c)
					cnt++;
	return cnt;

A. O ( N ) O(N) O(N)
B. O ( N 2 ) O(N^2) O(N2)
C. O ( N 3 ) O(N^3) O(N3)
D. O ( N 4 ) O(N^4) O(N4)

14、下面程序的输出为( )。

#include <iostream>
using namespace std;
int down(int n) {
    if (n <= 1)
        return n;
    return down(n - 1) + down(n - 2) + down(n - 3);
}
int main() {
    cout << down(6) << endl;
    return 0;
}
A. 6
B. 13
C. 20
D. 无法正常结束。

15、下面的程序使用邻接矩阵表达的带权无向图,则从顶点0到顶点3的最短距离为( )。

int weight[4][4] = {
	{0, 2, 5, 8},
	{2, 0, 1, 7},
	{5, 1, 0, 4},
	{8, 7, 4, 0}
};
A. 6 
B. 7 
C. 8 
D. 9

判断题(每题 2 分,共 20 分)

1、祖冲之是南北朝时期杰出的数学家、天文学家,其主要贡献在数学、天文历法和机械制造三方面。他首次将
“圆周率”精算到小数第七位,即在3.1415926和3.1415927之间。

2、C++语言中,表达式2 ^ 3的结果类型为int、值为8。( )

3、一棵有 个节点的完全二叉树,则树的深度为 ⌊ l o g 2 ( N ) ⌋ + 1 ⌊log_2(N)⌋ + 1 log2(N)⌋+1 。( )

4、能用动态规划解决的问题,一般也可以用贪心法解决,但动态规划的效率更高。( )

5、使用 math.h 或 cmath 头文件中的正弦函数,表达式 sin(30) 的结果类型为 double 、值约为 0.5 。( )

6、要求出简单有向图中从顶点 A 到顶点 B 的最短路径,在深度优先搜索和广度优先搜索中选择,广度优先更适 合。( )

7、某 N 个表项的哈希表,在发生哈希函数冲突时采用向后寻找空位的方法解决冲突。其查找操作的平均时间复杂度为O(1) ,即使当该哈希表的每个表项都有元素时,查找操作的平均时间复杂度仍为O(1) 。( )

8、动态规划有递推实现和递归实现,有时两种实现的时间复杂度不同。

9、围棋游戏中,判断落下一枚棋子后是否提掉对方的子,可以使用泛洪算法来实现。

10、类B继承了抽象类A,但未实现类A中的纯虚函数f,则类B不能直接实例化。( )

编程题 (每题 25 分,共 50 分)

交流问题

【问题描述】
来自 2 所学校 A 校、B 校的 N 名同学相聚在一起相互交流,方便起见,我们把这些同学从 1 至 N 编号。他们共进行了 M 次交流,第 i 次交流中,编号为 u i , v i u_i, v_i ui,vi 的同学相互探讨了他们感兴趣的话题,并结交成为了新的朋友。 由于这次交流会的目的是促进两校友谊,因此只有不同学校的同学之间会交流,同校同学并不会相互交流。
作为 A 校顾问,你对 B 校的规模非常感兴趣,你希望求出 B 校至少有几名同学、至多有几名同学。
【输入描述】
第一行两个正整数N, M ,表示同学的人数,交流的次数。
接下来 M 行,每行两个正整数 u i , v i u_i, v_i ui,vi ,表示一次交流。
题目保证输入合法,即交流一定是跨校开展的。
【输出描述】
输出一行两个整数,用单个空格隔开,分别表示 B 校至少有几名同学、至多有几名同学。
【特别提醒】
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
【样例输入 1】
4 3
1 2
2 3
4 2
【样例输出 1】
1 3
【样例输入 2】
7 5
1 2
2 3
4 2
5 6
6 7
【样例输出 2】
2 5
【数据规模】
对于30%的测试点,保证 N < = 17 , M < = 50 N <= 17, M <= 50 N<=17,M<=50
对于60%的测试点,保证 N < = 500 , M < = 2000 N <= 500, M <= 2000 N<=500,M<=2000
对于100%的测试点,保证 N < = 1 0 5 , M < = 2 ∗ 1 0 5 N <= 10^5, M <= 2 * 10^5 N<=105,M<=2105

俄罗斯方块

【问题描述】
小杨同学用不同种类的俄罗斯方块填满了一个大小为n * m 的网格图。
网格图由n * m 个带颜色方块构成。小杨同学现在将这个网格图交给了你,请你计算出网格图中俄罗斯方块的种类数。
如果两个同色方块是四连通(即上下左右四个相邻的位置)的,则称两个同色方块直接连通;若两个同色方块同时 与另一个同色方块直接或间接连通,则称两个同色方块间接连通。一个俄罗斯方块由一个方块和所有与其直接或间 接连通的同色方块组成。定义两个俄罗斯方块的种类相同当且仅当通过__平移__其中一个俄罗斯方块可以和另一个俄罗 斯方块重合;如果两个俄罗斯方块颜色不同,仍然视为同一种俄罗斯方块。
例如,在如下情况中,方块1 和方块2 是同一种俄罗斯方块,而方块1 和方块3 __不是__同一种俄罗斯方块。

方块1:   方块2:   方块3:
1 1 1   2 2 2      1
  1 1     2 2    1 1
                 1 1

【输入描述】
第一行包含两个正整数n, m ,表示网格图的大小。
对于之后 n 行,第 i 行包含 m 个正整数 a i 1 , a i 2 , . . . , a i m a_{i1}, a_{i2}, ..., a_{im} ai1,ai2,...,aim,表示该行m个方块的颜色。
【输出描述】
输出一个非负整数,表示俄罗斯方块的种类数。
【样例输入 1】
5 6
1 2 3 4 4 5
1 2 3 3 4 5
1 2 2 3 4 5
1 6 6 7 7 8
6 6 7 7 8 8
【样例输出 1】
7
【样例解释】

7种类型的俄罗斯方块如下:
类型1:	类型2:	类型3:	类型4:	类型5:	类型6:			类型7:
1       2       3       4 4     5         6 6   7 7     8
1       2       3 3       4     5       6 6   7 7     8 8
1       2 2       3       4     5
1

【数据范围】

子任务编号数据点占比nm m a x a i j maxa_{ij} maxaij特殊条件
130<=20<=20<=400所有的俄罗斯方块大小不超过5 * 5,即均可以放置于5 * 5的网格图中
230<=500<=500 < = 50 0 2 <=500^2 <=5002所有的俄罗斯方块的形状均为1 * x或 x * 1类型,其中x为任意正整数
340<=500<=500 < = 50 0 2 <=500^2 <=5002

对于全部数据,保证有 1 < = n , m < = 500 , 0 < = a i j < = 50 0 2 1 <= n, m <= 500, 0 <= a_{ij} <= 500^2 1<=n,m<=500,0<=aij<=5002

参考答案

单选题

题号123456789101112131415
答案BCDCDBABACCBCAB

判断题

题号12345678910
答案××××

编程题1


编程题2


  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青岛少儿编程-王老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值