本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。
一、单选题(每题 2 分,共 30 分)
第 1 题
下列C++代码的输出结果是( )。
#include <iostream>
#include <cmath>
using namespace std;
int main() {
cout << sin(3.1415926 / 2);
return 0;
}
A. 0
B. 1
C. 0.5
D. 0.7071
答案:B
第 2 题
对于如下图的二叉树,说法正确的是( )。
A. 先序遍历是 132 。
B. 中序遍历是 123 。
C. 后序遍历是 312 。
D. 先序遍历和后序遍历正好是相反的。
答案:D
第 3 题
已知两个序列s1= {1,3,4,5,6,7,7,8,1} 、s2= {3,5,7,4,8,2,9,5,1} ,则它们的最长公共子序列是()。
A. {3,5,7,8,1}
B. {3,4,5,7,8}
C. {5,7,8}
D. {3,5,7,9,1}
答案:A
第 4 题
关于序列 {2,7,1,5,6,4,3,8,9} ,以下说法错误的是( )。
A. {2,5,6,8,9} 是它的最长上升子序列
B. {1,5,6,8,9} 是它的最长上升子序列
C. {7,5,4,3} 是它的最长下降子序列
D. {1,5,6,8,9} 是它的唯一最长上升子序列
答案:D
第 5 题
关于图的深度优先搜索和广度优先搜索,下列说法错误的是( )。
A. 二叉树是也是一种图。
B. 二叉树的前序遍历和后序遍历都是深度优先搜索的一种。
C. 深度优先搜索可以从任意根节点开始。
D. 二叉树的后序遍历也是广度优先搜索的一种。
答案:D
第 6 题
对于如下二叉树,下面访问顺序说法错误的是( )。
A. HDEBFIGCA不是它的后序遍历序列
B. ABCDEFGHI是它的广度优先遍历序列
C. ABDHECFGI是它的深度优先遍历序列
D. ABDHECFGI是它的先序遍历序列
答案:A
第 7 题
以下哪个方案不能合理解决或缓解哈希表冲突( )。
A. 丢弃发生冲突的新元素。
B. 在每个哈希表项处,使用不同的哈希函数再建立一个哈希表,管理该表项的冲突元素。
C. 在每个哈希表项处,建立二叉排序树,管理该表项的冲突元素。
D. 使用不同的哈希函数建立额外的哈希表,用来管理所有发生冲突的元素。
答案:A
第 8 题
在C++中,关于运算符&,下面说法正确的是( )。
A. 2 & 3 的结果是 true
B. 011 & 111 的结果是 3
C. 3 & 6 的结果是 2
D. 110 & 101 的结果是 4
答案:C
第 9 题
下面关于图的说法正确的是( )。
A. 在无向图中,环是指至少包含三个不同顶点,并且第一个顶点和最后一个顶点是相同的路径。
B. 在有向图中,环是指一个顶点经过至少另一个顶点到自身的路径。
C. 在有向图中,如果任意两个顶点之间都存在一条边,则这个图一定是强连通图。
D. 在有向图中,所有顶点的入度和出度的总和就是图的边数的两倍。
答案:D
第 10 题
图的存储和遍历算法,下面说法错误的是( )。
A. 图的深度优先搜索和广度优先搜索对有向图和无向图都适用。
B. 图的深度优先搜索和二叉树的先序遍历道理是不一样的。
C. 图的深度优先搜索需要借助栈来完成。
D. 邻接表中,顶点 对应链表中的边结点数目正好是顶点 的度。
答案:B
第 11 题
如下图所示的邻接表结构,表示的是下列哪个选项中的图?
A.
B.
C.
D.
答案:C
第 12 题
如下图所示的邻接矩阵(inf表示无穷大),表示的是下列哪个选项中的图?
A.
B.
C.
D.
答案:A
第 13 题
下面程序的输出为( )。
#include <iostream>
using namespace std;
int fib(int n) {
if (n <= 1)
return n;
return fib(n - 1) + fib(n - 2);
}
int main() {
cout << fib(6) << endl;
return 0;
}
A. 5
B. 8
C. 13
D. 无法正常结束。
答案:B
第 14 题
下面 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++) {
int c = sqrt(a * a + b * b);
if (a + b + c > n)
break;
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)
答案:B
第 15 题
下列选项中,哪个可能是下图的深度优先遍历序列( )。
A. 1, 3, 7, 5, 4, 2, 6, 8, 9
B. 9, 4, 2, 1, 3, 5, 7, 6, 8
C. 1, 3, 4, 2, 7, 6, 8, 9, 5
D. 9, 7, 6, 8, 4, 2, 1, 5, 3
答案:C
二、判断题(每题 2 分,共 20 分)
第 16 题
C++语言中,表达式 6 & 5 的结果类型为 int 、值为 1 。
答案:错误
第 17 题
冒泡排序是稳定的排序算法。
答案:正确
第 18 题
唯一分解定理(算术基本定理)指出,每个大于1的自然数都可以唯一地分解成若干个素数的乘积。因此,我们可以很容易的对给定的自然数 n 进行质因数分解,时间复杂度仅为 O ( l o g ( n ) ) O(log(n)) O(log(n))。
答案:错误
第 19 题
C++语言中,可以为同一个类定义多个构造函数。
答案:正确
第 20 题
使用 math.h 或 cmath 头文件中的对数函数,表达式 log(128) 的结果类型为 double 、值约为 7.0 。
答案:错误
第 21 题
一颗 N 层的二叉树,至少有 2 N − 1 2^{N-1} 2N−1 个节点。
答案:错误
第 22 题
非连通图不能使用广度优先搜索算法进行遍历。
答案:错误
第 23 题
现使用有 N 个表项的哈希表,从 M 个元素中进行查找。该哈希表为解决哈希函数冲突,为每个表项处建立单链表存储冲突元素。其查找操作的最坏情况时间复杂度为 O ( M ) O(M) O(M)。
答案:正确
第 24 题
动态规划有递推实现和递归实现,对于很多问题,通过记录子问题的解,两种实现的时间复杂度是相同的。
答案:正确
第 25 题
泛洪算法的递归方法容易造成溢出,因此大的二维地图算法中,一般不用递归方法。
答案:正确
三、编程题(每题 25 分,共 50 分)
第 26 题
试题名称:黑白翻转
时间限制:1.0 s
内存限制:512.0 MB
题面描述
小杨有一棵包含
n
n
n 个节点的树,这棵树上的任意一个节点要么是白色,要么是黑色。小杨认为一棵树是美丽树当且仅当在删除所有白色节点之后,剩余节点仍然组成一棵树。
小杨每次操作可以选择一个白色节点将它的颜色变为黑色,他想知道自己最少要执行多少次操作可以使得这棵树变为美丽树。
输入格式
第一行包含一个正整数
n
n
n,代表树的节点数。
第二行包含
n
n
n 个非负整数
a
1
,
a
2
,
.
.
.
,
a
n
a_1,a_2,...,a_n
a1,a2,...,an,其中如果
a
i
=
0
a_i=0
ai=0,则节点
i
i
i 的颜色为白色,否则为黑色。
之后
n
−
1
n-1
n−1 行,每行包含两个正整数
x
i
,
y
i
x_i,y_i
xi,yi,代表存在一条连接节点
x
i
x_i
xi 和
y
i
y_i
yi 的边。
输出格式
输出一个整数,代表最少执行的操作次数。
样例1
5
0 1 0 1 0
1 2
1 3
3 4
3 5
2
样例解释
将节点
1
1
1 和
3
3
3 变为黑色即可使这棵树变为美丽树,此时删除白色节点
5
5
5,剩余黑色节点仍然组成一棵树。
数据范围
对于全部数据,保证有
1
≤
n
≤
1
0
5
,
0
≤
a
i
≤
1
1≤n≤10^5,0≤a_i≤1
1≤n≤105,0≤ai≤1。
参考程序
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
vector<int> g[N];
int col[N],num[N];
int ans,sum;
void calc(int x,int fa){
num[x]+=col[x];
for(auto i:g[x]){
if(i!=fa){
calc(i,x);
num[x]+=num[i];
}
}
}
void dfs(int x,int fa){
int fl=0;
if(num[x]!=sum&&num[x]!=0)fl=1;
for(auto i:g[x]){
if(i!=fa){
dfs(i,x);
if(num[i]!=0&&num[i]!=num[x]-col[x]){
fl=1;
}
}
}
if(fl==1&&col[x]!=1)ans++;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>col[i];
sum+=col[i];
}
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
g[v].push_back(u);
}
calc(1,0);
dfs(1,0);
cout<<ans<<"\n";
}
第 27 题
试题名称:区间乘积
时间限制:1.0 s
内存限制:512.0 MB
题面描述
小杨有一个包含
n
n
n 个正整数的序列
A
=
[
a
1
,
a
2
,
.
.
.
,
a
n
]
A=[a_1,a_2,...,a_n]
A=[a1,a2,...,an]。
小杨想知道有多少对
<
l
,
r
>
(
1
≤
l
≤
r
≤
n
)
<l,r>(1≤l≤r≤n)
<l,r>(1≤l≤r≤n) 满足
a
l
×
a
l
+
1
×
.
.
.
×
a
r
a_l×a_{l+1}×...×a_r
al×al+1×...×ar 为完全平方数。
一个正整数
x
x
x 为完全平方数当且仅当存在一个正整数
y
y
y 使得
x
=
y
×
y
x=y×y
x=y×y。
输入格式
第一行包含一个正整数
n
n
n,代表正整数个数。
第二行包含
n
n
n 个正整数
a
1
,
a
2
,
.
.
.
,
a
n
a_1,a_2,...,a_n
a1,a2,...,an,代表序列
A
A
A。
输出格式
输出一个整数,代表满足要求的
<
l
,
r
>
<l,r>
<l,r> 数量。
样例1
5
3 2 4 3 2
2
样例解释
满足条件的
<
l
,
r
>
<l,r>
<l,r> 有
<
3
,
3
>
<3,3>
<3,3> 和
<
1
,
5
>
<1,5>
<1,5>。
数据范围
对于全部数据,保证有
1
≤
n
≤
1
0
5
,
1
≤
a
i
≤
30
1≤n≤10^5,1≤a_i≤30
1≤n≤105,1≤ai≤30。
参考程序
#include<bits/stdc++.h>
using namespace std;
map<int,int> mp;
const int N = 1e5+10;
int calc(int x) {
int res = 0;
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) {
while (x% i == 0){
x/= i;
res^=(1<<(i-1));
}
}
}
if (x != 1) {
res^=(1<<(x-1));
}
return res;
}
int a[N];
int main(){
int n;
cin>>n;
long long ans = 0;
int pre = 0;
for(int i=1;i<=n;i++){
cin>>a[i];
int res = calc(a[i]);
pre^=res;
if(pre==0)
ans++;
ans+=mp[pre];
mp[pre]+=1;
}
cout<<ans<<"\n";
}