CCF编程能力等级认证GESP—C++8级—20241207

CCF编程能力等级认证GESP---C++8级---20241207

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

1、小杨家响应国家"以旧换新"政策,将自家的汽油车置换为新能源汽车,正在准备自编车牌。自编车牌包括5位数字或英文字母,要求第5位必须是数字,前4位中可以有最多1位英文字母。英文字母必须是大写,而且不能是O或I(因为容易与数字0或1混淆)。请问自编车牌共有多少种可能性?( )。

cpp 复制代码
A. 100,000
B. 1,060,000
C. 1,360,000
D. 1,460,000

正确答案:B

2、新年到,四家人在一起聚会。其中两家有三口人,另外两家有两口人。现在要安排大家在一张十人圆桌坐下,要求一家人必须相邻就座。由于有"主座"的习俗,每个座位都被认为是不同的。请问共有多少种就座方案?

cpp 复制代码
A. 8640
B. 6912
C. 144
D. 60

正确答案:A

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

cpp 复制代码
A.一个类可以继承多个类。
B.一个类可以被多个类继承。
C.一个类可以继承另一个类的子类。
D.抽象类必须被至少一个类继承,否则会编译错误。

正确答案:D

4、使用邻接表表达一个简单有向图,图中包含 v 个顶点、 e 条边,则该出边表中边节点的个数为( )。

cpp 复制代码
A. v * (v - 1)
B. v * v
C. 2 * e
D. e

正确答案:D

5、以下将二维数组作为参数的函数声明,哪个是符合语法的?( )。

cpp 复制代码
A. void Bubble(int a[10][], int m);
B. void Bubble(int a[][], int n, int m);
C. void Bubble(int (*a)[20], int n);
D. void Bubble(int * a[20], int n);

正确答案:C

__6、已知两个点 A 、 B 在平面直角坐标系下的坐标分别为(xa, ya)和(xb, yb),并分别定义变量 double xa, ya,xb, yb; 存储坐标。假设直线 AB 的斜率存在,下列哪个表达式可以用来表达它?( )。

__

cpp 复制代码
A. (xa - xb) / (ya - yb)
B. (xa - xb) / (yb - ya)
C. (ya - yb) / (xa - xb)
D. (ya - yb) / (xb - xa)

正确答案:C

7、二项式 ( x + y ) 6 (x + y)^6 (x+y)6的展开式中 x 3 y 3 x^3y^3 x3y3项的系数是( )

cpp 复制代码
A. 6
B. 15
C. 20
D. 120

正确答案:C

8、以下关于动态规划的说法中,错误的是( )。

cpp 复制代码
A. 动态规划方法有递推和递归两种实现形式。
B. 递归实现动态规划方法的时间复杂度总是不低于递推实现。
C. 动态规划方法将原问题分解为一个或多个相似的子问题。
D. 动态规划方法通常能够列出递推公式。

正确答案:B

9、在下面的程序中,使用整数表示一种组合。整数二进制表示的某一位为1,表示该位对应的数被选中,反之为0表示未选中。例如,从 0 - 5 这 6 个数中选出 3 个,则 0b111000 代表选中 3, 4, 5 三个数, 0b011001 代表选中 0, 3, 4 三个数。 zuhe_next 函数按组合对应的整数由大到小的顺序,求出组合 c 的下一个组合。横线处可以填入的是( )。

cpp 复制代码
int intlow2(int c) {
	return ________; // 在此处填入选项
}
int zuhe_next_incur(int c, int n, int l) {
	if (n == 1) return c;
	if ((c & (1 << l)) == 0) {
		int d = intlow2(c);
		c = (c & ~d);
		c = (c | (d >> 1));
	} else {
		c = (c & ~(1 << l));
		c = zuhe_next_incur(c, n - 1, l + 1);
		int d = intlow2(c);
		c = (c | (d >> 1));
	}
	return c;
}
// 从n个数中选m个,当前组合为c
int zuhe_next(int c, int n, int m) {
	return zuhe_next_incur(c, n, 0);
}
cpp 复制代码
A. ((c - 1) ^ c)
B. (((c - 1) ^ c) + 1)
C. (((c - 1) ^ c) >> 1)
D. ((((c - 1) ^ c) + 1) >> 1)

正确答案:D

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

cpp 复制代码
#include <iostream>
using namespace std;
int main() {
	int N = 15, cnt = 0;
	for (int x = 0; x + x + x <= N; x++)
		for (int y = x; x + y + y <= N; y++)
			for (int z = y; x + y + z <= N; z++)
				cnt++;
	cout << cnt << endl;
	return 0;
}
cpp 复制代码
A. 174
B. 447
C. 816
D. 4096

正确答案:A

11、下面最长公共子序列程序中,横线处应该填入的是( )。

cpp 复制代码
#define MAX(A, B) (((A) > (B)) ? (A) : (B))
#define MIN(A, B) (((A) < (B)) ? (A) : (B))
int dp[MAX_L + 1][MAX_L + 1];
int LCS(char str1[], char str2[]) {
	int len1 = strlen(str1);
	int len2 = strlen(str2);
	for (int i = 0; i < len1; i++)
		for(int j = 0; j < len2; j++)
			if (str1[i] == str2[j])
				dp[i + 1][j + 1] = dp[i][j] + 1;
			else
				_____; // 在此处填入选项
	return dp[len1][len2];
}
cpp 复制代码
A. dp[i + 1][j + 1] = dp[i][j + 1] + dp[i + 1][j]
B. dp[i + 1][j + 1] = MIN(dp[i][j + 1], dp[i + 1][j])
C. dp[i + 1][j + 1] = MAX(dp[i][j + 1], dp[i + 1][j])
D. dp[i + 1][j + 1] = MAX(dp[i][j + 1], dp[i + 1][j]) + 1

正确答案:C

12、下列Dijkstra算法中,横线处应该填入的是( )。

cpp 复制代码
typedef struct Edge {
	int in, out; // 从下标in顶点到下标out顶点的边
	int len; // 边长度
	struct Edge * next;
} Edge;
// v:顶点个数,graph:出边邻接表,start:起点下标,dis:输出每个顶点的最短距离
void dijkstra(int v, Edge * graph[], int start, int * dis) {
	const int MAX_DIS = 0x7fffff;
	for (int i = 0; i < v; i++)
		dis[i] = MAX_DIS;
	dis[start] = 0;
	int * visited = new int[v];
	for (int i = 0; i < v; i++)
		visited[i] = 0;
	visited[start] = 1;
	for (int t = 0; ; t++) {
		int min = MAX_DIS, minv = -1;
		for (int i = 0; i < v; i++) {
			if (visited[i] == 0 && min > dis[i]) {
				min = dis[i];
				minv = i;
			}
		}
	}
	delete[] visited;
}
cpp 复制代码
A.
if (dis[e->out] > e->len)
	dis[e->out] = e->len;
B.
if (dis[e->out] > min + e->len)
	dis[e->out] = min + e->len;
C.
if (dis[e->in] > e->len)
	dis[e->in] = e->len;
D.
if (dis[e->in] > min + e->len)
	dis[e->in] = min + e->len;

正确答案:B

13、假设图graph中顶点数v、边数e,上题程序的时间复杂度为( )。

A. O ( e ) O(e) O(e)

B. O ( v 2 ) O(v^2) O(v2)

C. O ( v l o g v + e ) O(vlogv + e) O(vlogv+e)

D. O ( ( v + e ) l o g v ) O((v + e)logv) O((v+e)logv)
正确答案:B

14、下面的快速排序程序中,两处横线处分别应填入的是( )。

cpp 复制代码
void quick_sort(int a[], int n) {
	if (n <= 1)
		return;
	int pivot = 0, l = 0, r = n - 1;
	while (________) { // 在此处填入选项
		while (r > pivot && a[r] >= a[pivot])
			r--;
		if (r > pivot) {
			int temp = a[pivot];
			a[pivot] = a[r];
			a[r] = temp;
			pivot = r;
		}
		while (l < pivot && a[l] <= a[pivot])
			l++;
		if (l < pivot) {
			int temp = a[pivot];
			a[pivot] = a[l];
			a[l] = temp;
			pivot = l;
		}
	}
	quick_sort(a, pivot);
	quick_sort(________); // 在此处填入选项
}
cpp 复制代码
A.
l < r
a + pivot + 1, n - pivot - 1
B.
l < r
a + pivot + 1, n - pivot
C.
l <= r
a + pivot + 1, n - pivot - 1
D.
l <= r
a + pivot + 1, n - pivot

正确答案:A

15、上题程序的时间复杂度为( )。

A. O ( n ) O(n) O(n)

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

C. O ( 2 n ) O(2^n) O(2n)

D. O ( n l o g n ) O(nlogn) O(nlogn)
正确答案:D

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

1、表达式'3' + '5' 的结果为'8',类型为 char 。

正确答案:错误

2、在C++语言中,可以在函数内定义结构体,但该结构体类型只能在该函数内使用。

正确答案:正确

3、对n个元素的数组进行排序,快速排序和归并排序的平均时间复杂度都为 O ( n l o g n ) O(nlogn) O(nlogn)。但快速排序存在退化情 况,使得时间复杂度升高至 O ( n 2 ) O(n^2) O(n2);归并排序需要额外的空间开销。

正确答案:正确

4、二维数组的最后一维在内存中一定是连续的,但第一维在内存中可能不连续。

正确答案:错误

5、使用 math.h 或 cmath 头文件中的函数,表达式 log(1000) 的结果类型为 double 、值约为 3 。

正确答案:错误

6、你有三种硬币,分别面值2元、5元和7元,每种硬币都有足够多。买一本书需要27元,则有8种硬币组合(组合与顺序无关,"1个2元+1个5元+1个2元"与"1个5元+2个2元"认为是同样的组合)可以正好付清,且不需要对方找钱。

正确答案:正确

7、使用哈希函数 f(x) = x % p 建立键值为 int 类型的哈希表,只要 p 取小于等于哈希表大小的素数,可保证不发生碰撞。

正确答案:错误

8、杨辉三角中的第n行、第m项,即为将二项式 ( a + b ) n (a + b)^n (a+b)n展开后 a n − m b m a^{n-m}b^m an−mbm项的系数。

正确答案:错误

9、判断图是否连通,可以通过广度优先搜索实现。

正确答案:正确

10、要求解一元二次方程 x 2 + a x + b = 0 x^2 + ax + b = 0 x2+ax+b=0,需要先判断表达式 a 2 − b ∗ 4 > = 0 a ^ 2 - b * 4 >= 0 a2−b∗4>=0 是否为真。

正确答案:错误

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

树上移动

【问题描述】

小杨有一棵包含n个节点的树,其中节点的编号从1到n,每个节点的颜色要么是白色要么是黑色。小杨可以任意选择节点s和节点t并从节点s出发移动到节点t,移动过程中小杨不能够经过重复节点。

小杨希望自己在至多经过k个黑色节点的前提下,经过的总节点数尽可能多,请你帮小杨选择经过最多的节点数是多少。
【输入格式】

第一行包含两个正整数n,k,代表节点数量和至多经过的黑色节点数。

第二行包含n个正整数 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1,a2,...,an,代表节点颜色,如果 a i = 0 a_i = 0 ai=0,代表节点颜色为白色,如果 a i = 1 a_i = 1 ai=1,代表节点颜色为黑色。

之后n - 1行,每行包含两个正整数 u i , v i u_i, v_i ui,vi,代表存在一条连接节点 u i u_i ui和 v i v_i vi的边。
【输出格式】

输出一个正整数,代表最多经过的节点数。
【样例输入 1】

5 1

0 0 1 1 1

1 2

2 3

2 5

1 4
【样例输出 1】

3

子任务编号 数据点占比 n k 特殊性质
1 20% ≤ 100 \le 100 ≤100 ≤ 100 \le 100 ≤100 树的形态为一条链
2 20% ≤ 1000 \le 1000 ≤1000 0
3 60% ≤ 1000 \le 1000 ≤1000 ≤ 1000 \le 1000 ≤1000

对局全部数据,保证有 1 ≤ n ≤ 1000 , 0 ≤ k ≤ 1000 , 0 ≤ a i ≤ 1 1 \le n \le 1000, 0 \le k \le 1000, 0 \le a_i \le 1 1≤n≤1000,0≤k≤1000,0≤ai≤1。

排队

【问题描述】

小杨所在班级共有n位同学,依次以1,2,...,n标号。这n位同学想排成一行队伍,其中有些同学之间关系非常好,在队伍里需要排在相邻的位置。具体来说,有m对这样的关系(m是一个非负整数)。当 m ≥ 1 m \ge 1 m≥1时,第i对关系 ( 1 ≤ i ≤ m ) (1 \le i \le m) (1≤i≤m)给出 a i , b i a_i, b_i ai,bi,表示排队时编号为 a i a_i ai的同学需要排在编号为 b i b_i bi的同学前面,并且两人在队伍中相邻。

现在小杨想知道总共有多少种排队方式。由于答案可能很大,你只需要求出答案对 1 0 9 + 7 10^9 + 7 109+7取模的结果。

【输入格式】

第一行,两个整数n, m,分别表示同学们的数量与关系数量。

接下来m行,每行两个整数 a i , b i a_i, b_i ai,bi,表示一对关系。

【输出格式】

一行,一个整数,表示答案对 1 0 9 + 7 10^9 + 7 109+7取模的结果。
【样例输入 1】

4 2

1 3

2 4
【样例输出 1】

2
【样例输入 2】

3 0
【样例输出 2】

6
【样例输入 3】

3 2

1 2

2 1
【样例输出 3】

0

【数据范围】

对于 20% 的测试数据点,保证 1 ≤ n ≤ 8 , 0 ≤ m ≤ 10 1 \le n \le 8, 0 \le m \le 10 1≤n≤8,0≤m≤10 。

对于另外 20% 的测试数据点,保证 1 ≤ n ≤ 1 0 3 , 0 ≤ m ≤ 1 1 \le n \le 10^3, 0 \le m \le 1 1≤n≤103,0≤m≤1。

对于所有测试数据点,保证 1 ≤ n ≤ 2 ∗ 1 0 5 , 0 ≤ m ≤ 2 ∗ 1 0 5 1 \le n \le 2 * 10^5, 0 \le m \le 2 * 10^5 1≤n≤2∗105,0≤m≤2∗105。

相关推荐
芒果爱编程1 小时前
MCU、ARM体系结构,单片机基础,单片机操作
开发语言·网络·c++·tcp/ip·算法
明明跟你说过1 小时前
【Go语言】从Google实验室走向全球的编程新星
开发语言·后端·go·go1.19
再不会python就不礼貌了1 小时前
震撼!最强开源模型通义千问2.5 72B竟在4GB老显卡上成功运行!
人工智能·算法·机器学习·chatgpt·产品经理
凌盛羽2 小时前
C#对Excel表csv文件的读写操作
开发语言·windows·物联网·microsoft·c#·excel
VBA63372 小时前
VBA高级应用30例应用在Excel中的ListObject对象:向表中添加注释
开发语言
Dontla2 小时前
Rust字节数组(Byte Array)Rust u8、Vec<u8>、数组切片、向量切片、字符串转字节数组转字符串、&[u8]类型:字节数组引用
开发语言·rust
走在考研路上4 小时前
Python错误处理
开发语言·python
数据小爬虫@4 小时前
Python爬虫:如何优雅地“偷窥”商品详情
开发语言·爬虫·python
CV大法好4 小时前
刘铁猛p3 C# 控制台程序引用System.Windows.Forms报错,无法引用程序集 解决方法
开发语言·c#
工业甲酰苯胺4 小时前
C语言之输入输出
c语言·c++·算法