2025年3月CCF—GESP(C++八级)编程能力等级认证试卷
八级
2025
2026-03-29 09:09:14
59次
一、单选题
下面的欧氏筛法程序中,两个横线处应填入的分别是?( )
int primes[MAXP], num = 0;
bool isPrime[MAXN + 1] = {false};
void sieve() {
for (int n = 2; n <= MAXN; n++) {
if (!isPrime[n])
primes[num++] = n;
for (int i = 0; i < num && ________; i++) { // 在此处填入选项
isPrime[n * primes[i]] = true;
if (________) // 在此处填入选项
break;
}
}
} | A. n * primes[i] < MAXN n % primes[i] == 0 |
B. n * primes[i] < MAXN primes[i] > n |
| C. n * primes[i] <= MAXN n % primes[i] == 0 |
D. n * primes[i] <= MAXN primes[i] > n |
【知识点】 CCF—GESP C++八级
下列程序实现了输出杨辉三角形,其时间复杂度为?( )
#include <iostream>
using namespace std;
#define N 35
int a[N];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
a[i] = 1;
for (int j = i - 1; j > 0; j--)
________; // 在此处填入选项
for (int j = 0; j <= i; j++)
cout << a[j] << " ";
cout << endl;
}
return 0;
} | A. O(n) |
B. O(n log n) |
| C.
|
D.
|
【知识点】 CCF—GESP C++八级
下列程序实现了输出杨辉三角形,代码中横线部分应该填入的是?( )
#include <iostream>
using namespace std;
#define N 35
int a[N];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
a[i] = 1;
for (int j = i - 1; j > 0; j--)
________; // 在此处填入选项
for (int j = 0; j <= i; j++)
cout << a[j] << " ";
cout << endl;
}
return 0;
} | A. a[j] += a[j + 1] |
B. a[j] += a[j - 1] |
| C. a[j - 1] += a[j] |
D. a[j + 1] += a[j] |
【知识点】 CCF—GESP C++八级
2025 是个神奇的数字,因为它是由两个数 20 和 25 拼接而成,而且 2025 =(20+25)2 。小杨决定写个程序找找小于 N 的正整数中共有多少这样神奇的数字。
该函数的时间复杂度为?( )
#include <string>
int count_miracle(int N) {
int cnt = 0;
for (int n = 1; n * n < N; n++) {
int n2 = n * n;
std::string s = std::to_string(n2);
for (int i = 1; i < s.length(); i++)
if (s[i] != '0') {
std::string sl = s.substr(0, i);
std::string sr = s.substr(i);
int nl = std::stoi(sl);
int nr = std::stoi(sr);
if (_________) // 在此处填入选项
cnt++;
}
}
return cnt;
} | A. O(N log N) |
B.
|
| C.
|
D.
|
【知识点】 CCF—GESP C++八级
下面Floyd算法中,横线处应该填入的是?( )
#include <iostream>
using namespace std;
#define N 21
#define INF 99999999
int map[N][N];
int main() {
int n, m, t1, t2, t3;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j)
map[i][j] = 0;
else
map[i][j] = INF;
}
}
for (int i = 1; i <= m; i++) {
cin >> t1 >> t2 >> t3;
map[t1][t2] = t3;
}
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (map[i][j] > map[i][k] + map[k][j])
________; // 在此处填入选项
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cout.width(4);
cout << map[i][j];
}
cout << endl;
}
} | A. map[i][j] = map[i][k] + map[k][j] |
B. map[i][k] = map[i][j] - map[k][j] |
| C. map[i][j] = map[i][k] - map[k][j] |
D. map[k][j] = map[i][j] - map[i][k] |
【知识点】 CCF—GESP C++八级
下面Floyd算法程序的时间复杂度为?( )
#include <iostream>
using namespace std;
#define N 21
#define INF 99999999
int map[N][N];
int main() {
int n, m, t1, t2, t3;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == j)
map[i][j] = 0;
else
map[i][j] = INF;
}
}
for (int i = 1; i <= m; i++) {
cin >> t1 >> t2 >> t3;
map[t1][t2] = t3;
}
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (map[i][j] > map[i][k] + map[k][j])
________; // 在此处填入选项
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cout.width(4);
cout << map[i][j];
}
cout << endl;
}
} | A. O(N) |
B.
|
| C.
|
D.
|
【知识点】 CCF—GESP C++八级
2025 是个神奇的数字,因为它是由两个数 20 和 25 拼接而成,而且 2025 =(20+25) 2。小杨决定写个程序找找小于 N 的正整数中共有多少这样神奇的数字。
下面程序横线处应填入的是?( )
#include <string>
int count_miracle(int N) {
int cnt = 0;
for (int n = 1; n * n < N; n++) {
int n2 = n * n;
std::string s = std::to_string(n2);
for (int i = 1; i < s.length(); i++)
if (s[i] != '0') {
std::string sl = s.substr(0, i);
std::string sr = s.substr(i);
int nl = std::stoi(sl);
int nr = std::stoi(sr);
if (_________) // 在此处填入选项
cnt++;
}
}
return cnt;
} | A. nl + nr == n |
B. nl + nr == n2 |
| C. (nl + nr) * (nl + nr) == n |
D. (nl + nr) ^ 2 == n2 |
【知识点】 CCF—GESP C++八级
二、判断题
三、编程题
上学
时间限制:1 s,内存限制:512 MB
【问题描述】
C 城可以视为由 n 个结点与 m 条边组成的无向图。这些结点依次以 1、2、……、n 标号,边依次以 1、2、……、m 标号。
第 i 条边(1<=i<=m)连接编号为 ui 与 vi 的结点,长度为 li 米。
小 A 的学校坐落在 C 城中编号为 s 的结点。小 A 的同学们共有 q 位,他们想在保证不迟到的前提下,每天尽可能晚地出门上学。但同学们并不会计算从家需要多久才能到学校,于是找到了聪明的小 A。
第 i 位同学(1<=i<=q )告诉小 A,他的家位于编号为 hi 的结点,并且他每秒能行走 1 米。请你帮小 A 计算,每位同学从家出发需要多少秒才能到达学校呢?
【输入描述】
第一行,四个正整数 n、m、s、q,分别表示 C 城的结点数与边数,学校所在的结点编号,以及小 A 同学们的数量。
接下来 m 行,每行三个正整数 ui、vi、li,表示 C 城中的一条无向边。
接下来 q 行,每行一个正整数 hi,表示一位同学的情况。
【输出描述】
共 q 行,对于每位同学,输出一个整数,表示从家出发到学校的最短时间。
【样例输入1】
5 5 3 3 1 2 3 2 3 2 3 4 1 4 5 3 1 4 2 5 1 4
【样例输出1】
4 3 1
【数据范围】
对于 20% 的测试点,保证 q=1。
对于另外 20% 的测试点,保证 1<=n<=500,1<=m<=500 。
对于所有测试点,保证 1<=n<=2×10^5,1<=m<=2×10^5 ,1<=q<=2×10^5 ,1<=ui、vi、hi<=n ,1<=li<=10^6 。
保证给定的图联通。
【知识点】 CCF—GESP C++八级
割裂
时间限制:1 s,内存限制:512 MB
【问题描述】
小杨有一棵包含 n 个节点的树,其中节点的编号从 1 到 n。
小杨设置了 a 个好点对 {<u1,v1>、<u2,v2>、……、<ua,va>} 和 1 个坏点对 {<bu,bv>}。一个节点能够被删除,当且仅当:
◆ 删除该节点后对于所有的 i(1<=i<=a),好点对 ui 和 vi 仍然连通;
◆ 删除该节点后坏点对 bu 和 bv 不连通。
如果点对中的任意一个节点被删除,其视为不连通。
小杨想知道,有多少个节点能够被删除。
【输入描述】
第一行包含两个正整数 n、a,含义如题面所示。
之后 n - 1 行,每行包含两个正整数 xi、yi,代表存在一条连接节点 xi 和 yi 的边。
之后 a 行,每行包含两个正整数 ui、vi,代表一个好点对 <ui,vi>。
最后一行包含两个正整数 bu、bv,代表坏点对 <bu,bv>。
【输出描述】
输出一个正整数,代表能够删除的节点个数。
【样例输入】
6 2 1 3 1 5 3 6 3 2 5 4 5 4 5 3 2 6
【样例输出】
2
【数据范围】
对于全部数据,保证有 。


【知识点】 CCF—GESP C++八级













