image

编辑人: 青衫烟雨

calendar2025-06-15

message9

visits436

2023年12月CCF-GESP编程能力等级认证C++编程七级真题参考答案

一、单选题

1、定义变量 double x ,如果下面代码输入为 100 ,输出最接近(   )。

A、

0

B、

-5

C、

-8

D、

8


2、对于下面动态规划方法实现的函数,以下选项中最适合表达其状态转移函数的为(   )。

A

B

C

D


3、下面代码可以用来求最长上升子序列(LIS)的长度,如果输入是: 5 1 7 3 5 9 ,则输出是(   )。

A、

9 7 5 1 1 9

B、

1 2 2 3 4 4

C、

1 3 5 7 9 9

D、

1 1 1 1 1 1


4、C++语言中,下列关于关键字 static 的描述不正确的是(   )。

A、

可以修饰类的成员函数。

B、

常量静态成员可以在类外进行初始化。

C、

若 a 是类 A 常量静态成员,则 a 的地址都可以访问且唯一。

D、

静态全局对象一定在 main 函数调用前完成初始化,执行完 main 函数后被析构。


5、G 是一个非连通无向图,共有 28 条边,则该图至少有(   )个顶点。

A、

6

B、

7

C、

8

D、

9


6、哈希表长31,按照下面的程序依次输入 4 17 28 30 4 ,则最后的 4 存入哪个位置?(   )

A、

3

B、

4

C、

5

D、

6


7、某二叉树T的先序遍历序列为: {A B D F C E G H} ,中序遍历序列为: {B F D A G E H C} ,则下列说法中正确的是(   )。

A、

T的度为1

B、

T的高为4

C、

T有4个叶节点

D、

以上说法都不对


8、下面代码段可以求两个字符串 s1 和 s2 的最长公共子串(LCS),下列相关描述不正确的是(   )。

A、

代码的时间复杂度为O(n2)

B、

代码的空间复杂度为O(n2)

C、

空间复杂度已经最优

D、

采用了动态规划求解


9、图的广度优先搜索中既要维护一个标志数组标志已访问的图的结点,还需哪种结构存放结点以实现遍历?(   )

A、

双向栈

B、

队列

C、

哈希表

D、


10、对关键字序列 {44,36,23,35,52,73,90,58} 建立哈希表,哈希函数为 h(k)=k%7 ,执行下面的Insert 函数,则等概率情况下的平均成功查找长度(即查找成功时的关键字比较次数的均值)为(   )。

A、

7/8

B、

1

C、

1.5

D、

2


11、学生在读期间所上的某些课程中需要先上其他的课程,所有课程和课程间的先修关系构成一个有向图 G ,有向边 <U, V> 表示课程 U 是课程 V 的先修课,则要找到某门课程 C 的全部先修课下面哪种方法不可行?(   )

A、

BFS搜索

B、

DFS搜索

C、

DFS+BFS

D、

动态规划


12、一棵完全二叉树有 2023 个结点,则叶结点有多少个?(   )

A、

1024

B、

1013

C、

1012

D、

1011


13、用下面的邻接表结构保存一个有向图 G , InfoType 和 VertexType 是定义好的类。设 G 有 n 个顶点、e 条弧,则求图 G 中某个顶点 u (其顶点序号为 k )的度的算法复杂度是(   )。

A、

O(n)

B、

O(e)

C、

O(n+e)

D、

O(n+2*e)


14、给定一个简单有向图 G ,判断其中是否存在环路的下列说法哪个最准确?(   )

A、

BFS更快

B、

DFS更快

C、

BFS和DFS一样快

D、

不确定


15、从顶点 v1 开始遍历下图 G 得到顶点访问序列,在下面所给的 4 个序列中符合广度优先的序列有几个?(   )

{v1 v2 v3 v4 v5} , {v1 v2 v4 v3 v5} , {v1 v4 v2 v3 v5} , {v1 v2 v4 v5 v3}

A 4

B 3

C 2

D 1


二、判断题

16、小杨这学期准备参加GESP的7级考试,其中有关于三角函数的内容,他能够通过下面的代码找到结束循环的角度值。(   )

A 正确

B 错误


17、小杨在开发画笔刷小程序(applet),操作之一是选中黄颜色,然后在下面的左图的中间区域双击后,就变成了右图。这个操作可以用图的泛洪算法来实现。(   )

A 正确

B 错误


18、假设一棵完全二叉树共有 个节点,则树的深度为log(N)+1。(   )

A 正确

B 错误


19、给定一个数字序列 A1,A2,A3,...,An ,要求 i 和 j ( 1<=i<=j<=n ),使 Ai+…+Aj 最大,可以使用动态规划方法来求解。(   )

A 正确

B 错误


20、若变量 x 为 double 类型正数,则 log(exp(x)) > log10(x) 。(   )

A 正确

B 错误


21、简单有向图有 n 个顶点和 e 条弧,可以用邻接矩阵或邻接表来存储,二者求节点 u 的度的时间复杂度一样。(   )

A 正确

B 错误


22、某个哈希表键值 x 为整数,为其定义哈希函数 H(x)=x%p ,则 p 选择素数时不会产生冲突。(   )

A 正确

B 错误


23、动态规划只要推导出状态转移方程,就可以写出递归程序来求出最优解。(   )

A 正确

B 错误


24、广度优先搜索(BFS)能够判断图是否连通。(   )

A 正确

B 错误


25、在C++中,如果定义了构造函数,则创建对象时先执行完缺省的构造函数,再执行这个定义的构造函数。(   )

A 正确

B 错误


三、实操题

26、商品交易

时间限制:1.0 s

内存限制:128.0 MB

问题描述

市场上共有N种商品,编号从0至N-1,其中,第i种商品价值vi元。

现在共有M个商人,编号从0至M-1。在第j个商人这,你可以使用第xj种商品交换第yj种商品。每个商人都会按照商品价值进行交易,具体来说,如果vxj>vyj,他将会付给你vyj-vxj元钱;否则,那么你需要付给商人vxj-vyj元钱。除此之外,每次交易商人还会收取1元作为手续费,不论交易商品的价值孰高孰低。

你现在拥有商品a,并希望通过一些交换来获得商品b。请问你至少要花费多少钱?(当然,这个最小花费也可能是负数,这表示你可以在完成目标的同时赚取一些钱。)

输入描述

第一行四个整数N,M,a,b,分别表示商品的数量、商人的数量、你持有的商品以及你希望获得的商品。保证0≤a,b<N,保证 a≠b。

第二行N个用单个空格隔开的正整数v0,v1,…,vN-1,依次表示每种商品的价值。保证1≤vi≤109

接下来M行,每行两个整数xj,yj,表示第j个商人愿意使用第xj种商品交换第yj种商品。保证0≤xj,yj<N,保证xj≠yj

输出描述

输出一行一个整数,表示最少的花费。特别地,如果无法通过交换换取商品b,请输出 No solution

特别提醒

在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。


样例输入 1

3 5 0 2
1 2 4
1 0
2 0
0 1
2 1
1 2

样例输出 1

5

样例解释 1

可以先找2号商人,花2-1=1元的差价以及1元手续费换得商品1,再找4号商人,花4-2=2元的差价以及1元手续费换得商品 。总计花费1+1+2+1=5元。


样例输入 2

3 3 0 2
100 2 4
0 1
1 2
0 2

样例输出 2

-95

样例解释 2

可以找2号商人,直接换得商品2的同时,赚取100-4=96元差价,再支付1元手续费,净赚95元。

也可以先找0号商人换取商品1,再找1号商人换取商品2,不过这样只能赚94元。


样例输入 3

4 4 3 0
1 2 3 4
1 0
0 1
3 2
2 3

样例输出 3

No solution

数据规模

对于30%的测试点,保证N≤10,M≤20。

对于70%的测试点,保证N≤103,M≤104

对于100%的测试点,保证N≤105,M≤2×105

参考答案:对于此题,我们需要遍历每个商人,尝试使用当前持有的商品进行交换,并计算花费。如果无法交换得到目标商品,则输出"No solution"。具体步骤如下:1. 初始化花费为0。2. 遍历每个商人,对于第j个商人:* 如果该商人愿意接受当前持有的商品,则计算花费:+ 如果当前商品价值大于目标商品价值,则花费为v[y[j]] - v[x[j]] + 1(商品价值差+手续费);+ 如果当前商品价值小于目标商品价值,则花费为v[x[j]] - v[y[j]] + 1(商品价值差+手续费)。* 如果该商人不愿意接受当前持有的商品,则跳过该商人。3. 如果最终未能交换得到目标商品,则输出"No solution"。4. 否则,输出最小花费。


27、试题名称:纸牌游戏

时间限制:1.0 s

内存限制:128.0 MB

问题描述

你和小杨在玩一个纸牌游戏。

你和小杨各有 3 张牌,分别是 0、1、2。你们要进行N轮游戏,每轮游戏双方都要出一张牌,并按 1 战胜 0,2 战胜1,0 战胜 2 的规则决出胜负。第i轮的胜者可以获得2ai分,败者不得分,如果双方出牌相同,则算平局,二人都可获得ai分(i=1,2,…,N )。

玩了一会后,你们觉得这样太过于单调,于是双方给自己制定了不同的新规则。小杨会在整局游戏开始前确定自己全部n轮的出牌,并将他的全部计划告诉你;而你从第 2 轮开始,要么继续出上一轮出的牌,要么记一次“换牌”。

游戏结束时,你换了t次牌,就要额外扣b1+…+bt分。

请计算出你最多能获得多少分。

输入描述

第一行一个整数N,表示游戏轮数。

第二行N个用单个空格隔开的非负整数a1,……,aN,意义见题目描述。

第三行N-1个用单个空格隔开的非负整数b1,…,bN-1,表示换牌的罚分,具体含义见题目描述。由于游戏进行N轮,所以你至多可以换N-1次牌。

第四行N个用单个空格隔开的整数c1,…,cN-1,依次表示小杨从第 轮至第 轮出的牌。保证ci∈0,1,2。

输出描述

一行一个整数,表示你最多获得的分数。

特别提醒

在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。


样例输入 1

4
1 2 10 100
1 100 1
1 1 2 0

样例输出 1

219

样例解释 1

你可以第1轮出 0,并在第2,3轮保持不变,如此输掉第1,2轮,但在第3轮中取胜,获得2×10=20分;随后,你可以在第4轮中以扣1分为代价改出 1,并在第4轮中取得胜利,获得2×100=200分。如此,你可以获得最高的总分20+200-1=219 。


样例输入 2

6
3 7 2 8 9 4
1 3 9 27 81
0 1 2 1 2 0

样例输出 2

56

数据规模

对于30%的测试点,保证N≤15。

对于60%的测试点,保证N≤100。

对于所有测试点,保证N≤1000;保证0≤ai,bi≤106

参考答案:对于每一轮,我们需要根据小杨的出牌和当前轮数来决策。我们可以使用动态规划来解决这个问题。首先,我们定义一个二维数组dp[i][j],其中i表示当前轮数,j表示当前你的牌面。dp[i][j]表示在第i轮,你的牌面为j时,你最多能获得的分数。对于每一轮,我们有两种选择:1. 出上一轮相同的牌,即j=last_card。这种情况下,如果小杨的牌为0,则当前轮为平局,双方各得a[i]分;如果小杨的牌为1,则你输了当前轮,不得分;如果小杨的牌为2,则你赢了当前轮,得2a[i]分。然后,我们可以根据上一轮的结果更新dp[i][j]。2. 换牌,即j≠last_card。这种情况下,我们需要考虑换牌后的结果。换牌后,我们可能会输掉当前轮,也可能会赢得当前轮。我们需要计算两种情况下的最大分数,并取较大值作为dp[i][j]的值。最后,我们遍历最后一轮的dp数组,找到最大的分数作为答案。


喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2023年12月CCF-GESP编程能力等级认证C++编程七级真题参考答案

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share