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

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

  • [单选题(每题 2分,共 30分)](#单选题(每题 2分,共 30分))
  • [判断题(每题 2分,共 20分)](#判断题(每题 2分,共 20分))
  • 编程题 (每题 25分,共 50分)
    • [3.1 编程题 1 猫和老鼠](#3.1 编程题 1 猫和老鼠)
    • [3.2 编程题 2 宝石项链](#3.2 编程题 2 宝石项链)

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

1、某平台生成"取件码"由6个字符组成:前4位为数字( 0 -- 9 ),后2位为大写字母( A -- Z ),其中字母不能 为 I 、 O 。假设数字和字母均可重复使用,要求整个取件码中恰好有2个数字为奇数。共有多少种不同取件码?( )

cpp 复制代码
A. 1,440,000
B. 2,160,000
C. 2,535,000
D. 8,640,000

正确答案:C

2、下列代码实现了归并排序(Merge Sort)的分治部分。为了正确地将数组 a 的 [left, right] 区间进行 排序,横线处应该填入的是( )。

cpp 复制代码
void merge_sort(int a[], int left, int right) {
	if (left >= right) return;
	int mid = (left + right) / 2;
	merge_sort(a, left, mid);
	________; // 在此处填入选项
	merge(a, left, mid, right); // 合并操作
}
cpp 复制代码
A. merge_sort(a, mid, right)
B. merge_sort(a, mid + 1, right)
C. merge_sort(a, left, mid + 1)
D. merge_sort(a, mid 1, right)

正确答案:B

3、某社团有男生8人、女生7人。现需选出1名队长(性别不限)、1名副队长(性别不限)、2名宣传委员(两 人无角色区别,且必须至少1名女生)。假如一人不能兼任多职,共有多少种不同选法?( )

cpp 复制代码
A. 12012
B. 11844
C. 12474
D. 11025

正确答案:C

4、二项式 ( 2 x − y ) 8 (2x - y)^8 (2x−y)8的展开式中 x 5 y 3 x^5y^3 x5y3 项的系数为( )。

cpp 复制代码
A. -7168
B. 7168
C. -1792
D. 1792

正确答案:D

5、下面是使用邻接矩阵实现的Dijkstra算法的核心片段,用于求单源最短路径。在找到当前距离起点最近的顶点 u 后,需要更新其邻接点 j 的距离。横线处应填入的代码是( )。

cpp 复制代码
for (int j = 1; j <= n; j++) { 
	if (!visited[j] && graph[u][j] < INF) { 
		if (________) { // 在此处填入选项 
			dis[j] = dis[u] + graph[u][j]; 
		} 
	} 
}
cpp 复制代码
A. dis[j] < dis[u] + graph[u][j]
B. dis[j] > dis[u] + graph[u][j]
C. graph[u][j] > dis[u] + dis[j]
D. dis[j] > graph[u][j]

正确答案:B

6、下面程序使用动态规划求两个字符串的最长公共子序列(LCS)长度,横线处应填入的是( )。

cpp 复制代码
#include <algorithm>
#include <string>
#include <vector>
using namespace std;
int lcs_len(const string &a, const string &b) {
	int n = (int)a.size(), m = (int)b.size();
	vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			if (a[i - 1] == b[j - 1])
				dp[i][j] = dp[i - 1][j - 1] + 1;
			else
				________; // 在此处填入选项
	return dp[n][m];
}
cpp 复制代码
A. dp[i][j] = dp[i 1][j] + dp[i][j 1];
B. dp[i][j] = min(dp[i 1][j], dp[i][j 1]);
C. dp[i][j] = max(dp[i 1][j], dp[i][j 1]);
D. dp[i][j] = max(dp[i 1][j], dp[i][j 1]) + 1;

正确答案:C

7、已知两个点 和 在平面直角坐标系中的坐标。下列C++表达式中,能正确计算这两点之间 直线距离的是( )。

cpp 复制代码
A. sqrt((x1 x2) ^ 2 + (y1 y2) ^ 2)
B. sqrt(pow(x1 x2, 2) + pow(y1 y2, 2))
C. pow(x1 x2, 2) + pow(y1 y2, 2)
D. abs(x1 x2) + abs(y1 y2)

正确答案:B

8、已知 int a = 10; ,执行 int &b = a; b = 20; 后,变量 a 的值是( )。

cpp 复制代码
A. 10
B. 20
C. 30
D.编译错误

正确答案:B

9、下列代码的时间复杂度(以 为自变量,忽略常数与低阶项)是( )。

cpp 复制代码
long long s = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j * j <= i; j++) { s += j; } }
A.
B.
C.
D.

正确答案:无

10、下列程序实现了线性筛法(欧拉筛),用于在 时间内求出 之间的所有质数。为了保证每个合数 只被其最小质因子筛掉,横线处应填入的语句是( )。

cpp 复制代码
for (int i = 2; i <= n; i++) { if (!not_prime[i]) primes[++cnt] = i;    for (int j = 1; j <= cnt && i * primes[j] <= n; j++) { not_prime[i * primes[j]] = true; if (________) break; // 在此处填入选项 } }
A. i + primes[j] == n
B. primes[j] > i
C. i % primes[j] == 0
D. i % primes[j] != 0

正确答案:C

11、在C++语言中,关于类的继承和访问权限,下列说法正确的是( )。

cpp 复制代码
A.派生类可以访问基类的 private 成员。
B.基类的 protected 成员在私有继承(private inheritance)后,在派生类中变为 public 。
C.派生类对象在创建时,会先调用基类的构造函数,再调用派生类自己的构造函数。
D.派生类对象在销毁时,会先调用基类的析构函数,再调用派生类自己的析构函数。

正确答案:C

12、当输入 6 时,下列程序的输出结果为( )。

cpp 复制代码
#include <iostream> using namespace std; int f(int n) { if (n <= 3) return n; return f(n 1) + f(n 2) + 2 * f(n 3); } int main() { int n; cin >> n; cout << f(n) << endl; return 0; }
A. 14
B. 27
C. 28
D. 15

正确答案:B

13、从1到999这999个正整数中,十进制表示中数字 5 恰好出现一次的数有多少个?( )

cpp 复制代码
A. 243
B. 271
C. 300
D. 333

正确答案:A

14、当输入 2023 时,下列程序的输出结果为( )。

cpp 复制代码
A. 7
B. 8
C. 9
D. 11

正确答案:C

15、对连通无向图执行Kruskal算法。已按边权从小到大依次扫描到某条边 。此时在已经构建的部分 MST结构中, 已在同一连通块内。关于边 的处理,下列说法正确的是( )。

cpp 复制代码
A.必须选入MST,否则可能不连通。
B.一定不能选入MST(在此扫描顺序下)。
C.若后续出现更大的边权,可以回溯改选 。
D.只有当 是当前最小边时才能舍弃。

正确答案:B

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

1、若一项任务可用两种互斥方案完成:方案A有 种做法,方案B有 种做法,则总做法数为 。( )

正确答案:错误

2、在C++语言中,引用一旦被初始化,就不能再改为引用另一个变量。( )

正确答案:正确

3、快速排序和归并排序的平均时间复杂度都是 ,但快速排序是不稳定的排序算法,归并排序是稳定 的排序算法。( )

正确答案:正确

4、使用 math.h 或 cmath 头文件中的函数,表达式 sqrt(4) 的结果类型为 double 。( )

正确答案:正确

5、在杨辉三角形中,第 行(从0开始计数,即第 行有 个数)的所有数字之和等于 。( )

正确答案:正确

6、使用二叉堆优化的Dijkstra最短路算法,在某些特殊情况下时间复杂度不如朴素实现的 。( )

正确答案:错误

7、 个不同元素依次入栈的出栈序列数与将 个不同元素划分成若干非空子集的方案数相等。( )

正确答案:错误

8、快速排序在最坏情况下的时间复杂度为 ,可以通过随机化选择基准值(pivot)的方法完全避免退 化。( )

正确答案:错误

9、在C++语言中,一个类可以拥有多个构造函数,也可以拥有多个析构函数。( )

正确答案:错误

10、求两个序列的最长公共子序列(LCS)时,使用滚动数组优化空间后,仍然可以还原出具体的LCS序列。( )

正确答案:错误

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

3.1 编程题 1 猫和老鼠

【问题描述】

猫和老鼠所在的庄园可以视为一张由 个点和 条带权无向边构成的连通图。结点依次以 编号,结点 ( )有价值为 的奶酪。在 条带权无向边中,第 ( )条无向边连接结点 与结点 ,边权 表示猫和老鼠通过这条边所需的时间。

猫窝位于结点 ,老鼠洞位于结点 。对于老鼠而言,结点 是安全的当且仅当:

老鼠能规划一条从结点 出发逃往老鼠洞的路径,使得对于路径上任意结点 (包括结点 与老鼠洞)都有: 猫从猫窝出发到结点 的最短时间严格大于老鼠从结点 沿这条路径前往结点 所需的时间。

老鼠在拿取安全结点的奶酪时不存在被猫抓住的可能,但在拿取不是安全结点的奶酪时则不一定。为了确保万无一 失,老鼠决定只拿取安全结点放置的奶酪。请你计算老鼠所能拿到的奶酪价值之和。

【输入格式】

第一行,两个正整数 ,分别表示图的结点数与边数。

第二行,两个正整数 ,分别表示猫窝的结点编号,以及老鼠洞的结点编号。

第三行, 个正整数 ,表示各个结点的奶酪价值。

接下来 行中的第 行( )包含三个正整数 ,表示图中连接结点 与结点 的边,边权为 。

【输出格式】

输出一行,一个整数,表示老鼠所能拿到的奶酪价值之和。

【样例输入 1】

复制代码
5 5
1 2
1 2 4 8 16
1 2 4
2 3 3
3 4 1
2 5 2
3 1 8

【样例输出 1】

复制代码
22

【样例输入 2】

复制代码
6 10
3 4
1 1 1 1 1 1
1 2 6
2 3 3
3 1 4
3 4 5
4 5 8
5 6 2
6 4 1
3 2 4
5 4 4
3 6 1

【样例输出 2】

复制代码
3

【数据范围】

对于 的测试点,保证 , 。

对于所有测试点,保证 , , 且 , , 。

【参考程序】

cpp 复制代码
#include <cstdio>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
const int N = 1e5 + 5;
const long long oo = 1e18;
int n, m;
int a, b;
int c[N];
vector<pair<int, int>> e[N];
long long dis[N];
priority_queue<pair<long long, int>> q;
long long ans;
int main() {
scanf("%d%d", &n, &m);
scanf("%d%d", &a, &b);
for (int i = 1; i <= n; i++)
scanf("%d", &c[i]);
for (int i = 1; i <= m; i++) {
int u, v, w;
scanf("%d%d%d", &u, &v, &w);
e[u].emplace_back(make_pair(v, w));
e[v].emplace_back(make_pair(u, w));
}
for (int i = 1; i <= n; i++)
dis[i] = oo;
dis[b] = 0;
q.push(make_pair(-dis[b], b));
while (!q.empty()) {
auto p = q.top();
q.pop();
if (dis[p.second] != -p.first)
continue;
int u = p.second;
for (auto r : e[u]) {
int v = r.first, w = r.second;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
q.push(make_pair(-dis[v], v));
}
}
}
for (int i = 1; i <= n; i++)
if (dis[i] < dis[a])
ans += c[i];
printf("%lld\n", ans);
return 0;
}

3.2 编程题 2 宝石项链

【问题描述】

小 A有一串包含 枚宝石的宝石项链,这些宝石按照在项链中的顺序依次以 编号,第 枚宝石与第 枚 宝石相邻。项链由 种宝石组成,其中第 枚宝石种类为 。

小 A想将宝石项链分给他的好朋友们。具体而言,小 A会将项链划分为若干连续段,并且需要保证每段都包含全部 种宝石。请帮小 A计算在满足条件的前提下,宝石项链最多可以划分为多少段。

【输入格式】

第一行,两个正整数 ,分别表示宝石项链中的宝石的数量与种类数。

第二行, 个正整数 ,表示每枚宝石的种类。

【输出格式】

输出一行,一个整数,表示宝石项链最多可以划分的段数。

【样例输入 1】

复制代码
6 2
1 2 1 2 1 2

【样例输出 1】

复制代码
2

【样例输入 2】

复制代码
7 3
3 1 3 1 2 1 2

【样例输出 2】

复制代码
2

【数据范围】

对于 的测试点,保证 。

对于所有测试点,保证 , , ,保证 均在 中出现。

【参考程序】

cpp 复制代码
#include <cstdio>
#include <algorithm>
using namespace std;
const int L = 20;
const int N = 2e5 + 5;
const int oo = 1e9;
int n, m;
int t[N], jump[L][N];
int cnt[N], tot;
int ans;
int go(int u) {
int cnt = 0, ans = 0;
for (int i = L 1; i >= 0; i--)
if (cnt + jump[i][u] <= n) {
cnt += jump[i][u];
ans += 1 << i;
u = (u + jump[i][u] 1) % n + 1;
}
return ans;
}
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &t[i]);
t[i + n] = t[i];
}
for (int i = 1, r = 0; i <= n; i++) {
while (tot < m) {
r++;
if (!cnt[t[r]]++)
tot++;
}
jump[0][i] = r i + 1;
if (!--cnt[t[i]])
tot--;
}
for (int i = 1; i < L; i++)
for (int j = 1; j <= n; j++) {
int tar = (j + jump[i 1][j] 1) % n + 1;
jump[i][j] = min(jump[i 1][j] + jump[i 1][tar], oo);
}
for (int i = 1; i <= n; i++)
ans = max(ans, go(i));
printf("%d\n", ans);
return 0;
}
相关推荐
cike_y2 小时前
Spring:代理模式之静态代理&动态代理
java·后端·spring·代理模式
任子菲阳2 小时前
学JavaWeb第六天——JDBC & Mybatis
java·数据库·mybatis
charlie1145141912 小时前
FreeRTOS:中断(ISR)与 RTOS 安全 API
开发语言·c·freertos·实时操作系统
计算机毕设指导62 小时前
基于微信小程序的个性化漫画阅读推荐系统【源码文末联系】
java·python·微信小程序·小程序·tomcat·maven·intellij-idea
hd51cc2 小时前
MFC打印技术
c++·mfc
一路往蓝-Anbo2 小时前
STM32单线串口通讯实战(三):协议层设计 —— 帧结构、多机寻址与硬件唤醒
c语言·开发语言·stm32·单片机·嵌入式硬件·物联网
Love Song残响2 小时前
高效自动化清理临时文件方案
java·开发语言·spring
技术小泽2 小时前
java转go语言入门基础篇(二)
java·golang
古城小栈2 小时前
Rust 中符号语法 一文全晓
开发语言·后端·rust