GESP编程能力等级认证C++编程真题解析 | 2024年3月八级

学习C++从娃娃抓起!记录下CCF-GESP备考学习过程中的题目,记录每一个瞬间。

附上汇总贴:GESP编程能力等级认证C++编程真题解析 | 汇总


单选题

第1题

为丰富食堂菜谱,炒菜部进行头脑风暴。肉类有鸡肉、牛肉、羊肉、猪肉4种,切法有肉排、肉块、肉末3种,配菜有圆白菜、油菜、豆腐3种,辣度有麻辣、微辣、不辣3种。不考虑口感的情况下,选1种肉、1种切法、1种配菜、1种辣度产生一道菜(例如:麻辣牛肉片炒豆腐),这样能产生多少道菜?( )。

A.13

B.42

C.63

D.108

【答案】:D

【解析】

C 4 1 ∗ C 3 1 ∗ C 3 1 ∗ C 3 1 = 108 C_{4}^{1} * C_{3}^{1} * C_{3}^{1} * C_{3}^{1}=108 C41C31C31C31=108

第2题

已知袋中有2个相同的红球、3个相同的绿球、5个相同的黄球。每次取出一个不放回,全部取出。可能产生多少种序列?( )。

A.6

B.1440

C.2520

D.3628800

【答案】:C

【解析】

10 ! 2 ! ∗ 3 ! ∗ 5 ! = 2520 \frac{10!}{2! * 3 ! * 5!} = 2520 2!3!5!10!=2520

第3题

以下二维数组的初始化,哪个是符合语法的?( )。

A.int a[][]={{1, 2} , {3, 4}};

B.int a[][2] = {};

C.int a[2][2] ={{1, 2, 3} , {4, 5, 6}};

D.int a[2] ={{1, 2, 3} , {4, 5, 6}};

【答案】:B

【解析】

A、D选项二维数组的初始化,[ ]中一定要有明确的数字。C超了,有6个数字

第4题

下面有关C++拷贝构造函数的说法,错误的是( )。

A.必须实现拷贝构造函数,否则一定会出现编译错误。

B.对象作为函数参数、以值传递方式传入函数时,会自动调用拷贝构造函数。

C.对象作为函数返回值、以值传递方式从函数返回时,会自动调用拷贝构造函数。

D.使用一个对象初始化另一个对象时,会自动调用拷贝构造函数。

【答案】:A

【解析】

不是必须实现拷贝构造函数。

第5题

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

A.v * (v-1)

B.v * v

C.2 * e

D.e

【答案】:C

【解析】

邻接表保存,一条边2个顶点,所以节点个数为2 * e

第6题

关于生成树的说法,错误的是( )。

A.一个无向连通图可以有多个生成树。

B.一个无向图,只要连通,就一定有生成树。

C.n个顶点的无向完全图,有nn-2棵生成树。

D.n个顶点的无向图,生成树包含n-1条边。

【答案】:D

【解析】

B和D矛盾,一个无向图,只有连通(边至少为n条),才可能删除某些边达到n-1条边的树。

第7题

已知三个double类型的变量a、b和theta分别表示一个三角形的两条边长及二者的夹角(弧度) , 则下列哪个表达式可以计算这个三角形的周长?( )。

A.a * b * sin(theta) / 2

B.a + b + (a + b) * sin(theta) / 2

C.a * b * cos(theta) / 2

D.a + b + sqrt(a * a + b * b - 2 * a * b * cos(theta))

【答案】:D

【解析】

数学公式

第8题

在有个元素的二叉排序树中进行查找,其最好、最差时间复杂度分别为( )。

A.O(1)、O(n)

B.O(1) 、O(logn)

C.O(logn) 、O(logn)

D.O(logn) 、O(n)

【答案】:A

【解析】

最差的情况,树就是一条链,时间复杂度是O(n)

第9题

如下图所示,半径为r、圆心角为t (弧度)的扇形,下面哪个表达式能够求出顶部阴影部分的面积?( )

在这里插入图片描述

A.r * r * sin(t) / 2

B.r * r * t / 2

C.r * r * (t - sin(t))

D.r * r * (t - sin(t)) / 2

【答案】:D

【解析】

扇形的面积 t ∗ r 2 / 2 t * r^2 / 2 tr2/2。sin(x)=sin(180-t)=sin(t)=h/r,所以h = r * sin(t),三角形面积=r * sin(t) * r / 2,阴影面积=r * r * (t - sin(t)) / 2

第10题

下面程序的时间复杂度为( )。

int fib(int n) {
	if (n <= 1)
		return 1;
	return fib(n - 1) + fib(n - 2);
}

A. O ( 2 n ) O(2^n) O(2n)

B.在这里插入图片描述

C.O(n)

D.O(1)

【答案】:B

【解析】

没有特殊判断的斐波那契数列,斐波那契数正常递归算法的时间复杂度会比 O ( 2 n ) O(2^n) O(2n)小一点,因为走到n=1时,二叉树就没有所以不是A。肯定也不是C和D。

第11题

下面程序的时间复杂度为( )。

int choose(int n, int m) {
	if (m==0 || m==n)
		return 1;
	return choose(n-1, m-1) + choose(n-1, m);
}

A. O ( 2 n ) O(2^n) O(2n)

B. O ( 2 m × ( n − m ) ) O(2^m\times (n-m)) O(2m×(nm))

C.O(C(n,m))

D. O ( m × ( n − m ) ) O(m\times (n-m)) O(m×(nm))

【答案】:C

【解析】

C(n,m)=C(n-1,m-1)+C(n-1,m),排列组合的时间复杂度就是O(C(n,m))

第12题

下面程序的时间复杂度为( )。

int primes[MAXP], num = 0;
bool isPrime[MAXN] = {false};
void sieve() {
	for (int n=2; n<=MAXN; n++) {
		if (!isPrime[n])
			primes[num++] = n;
		for (int i=0; i<num && n * prime[i] <= MAXN; i++) {
			isPrime[n * primes[i]] = true;
			if (n % primes[i] == 0)
				break;
		}
	}
}

A.O(n)

B.O(n * logn)

C.O(n * loglogn)

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

【答案】:A

【解析】

线性筛的模板,时间复杂度是O(n)

第13题

下面程序的输出为( )。

#inlude <iostream>
using namespace std;

int a[10][10];
int main() {
	int m = 5, n = 4;
	for (int x = 0; x <= m; x++)
		a[x][0] = 1;
	for (int y = 1; y <= n; y++)
		a[0][y] = 1;
	for (int x = 1; x <= m; x++)
		for (int y = 1; y <= n; y++)
			a[x][y] = a[x-1][y] + a[x][y-1];
	cout << a[m][n] << endl;
	return 0;
}

A.4

B.5

C.126

D.3024

【答案】:C

【解析】

类似杨辉三角形,可以枚举,结果为126

第14题

下面程序的输出为( )。

#include <iostream>
using namespace std;

int main() {
	int cnt = 0;
	for (int x = 0; x <= 10; x++)
		for (int y = 0; y <= 10; y++)
			for (int z = 0; z <= 10; z++)
				if (x + y + z == 15)
					cnt++;
	cout << cnt << endl;
	return 0;
}

A.90

B.91

C.96

D.100

【答案】:B

【解析】

x=0时,y和z的组合有6种,x=1时,y和z的组合有7种,依此类推,6 + 7 + 8 + 9 + 10 + 11 + 10 + 9 + 8 +7 + 6 = 91

第15题

下面的程序使用邻接矩阵表达的带权无向图,则从顶点0到顶点3的最短距离为( )。

int weight[4][4] = {
	{0, 1, 7, 100},
	{1, 0, 5, 15},
	{7, 5, 0, 6},
	{100, 15, 6, 0}}

A.100

B.16

C.12

D.13

【答案】:C

【解析】

最短路径是0->1,1->2,2->3

判断题

第16题

已知int类型的变量a和b, 则执行语句a, b=b, a; 后, 变量a和b的值会互换。( )

A.正确

B.错误

【答案】:B

【解析】

没有赋值给其他变量,所以a和b的值没有变化

第17题

一个袋子中有3个完全相同的红色小球、2个完全相同的蓝色小球。每次从中取出1个,再放回袋子,这样进行3次后,可能的颜色顺序有7种。( )

A.正确

B.错误

【答案】:B

【解析】

全红1种(红红红),2红1蓝3种(蓝红红、红蓝红、红红蓝),1红2蓝3种(红蓝蓝、蓝红蓝、蓝蓝红),全蓝1种(蓝蓝蓝),共8种

第18题

孙子定理是求解一次同余方程组的方法,最早见于中国南北朝时期用(公元5世纪)的数学著作《孙子算经》。又称中国余数定理,是中国数学史上的项伟大成就。( )

A.正确

B.错误

【答案】:A

【解析】

孙子定理的定义

第19题

N个顶点的无向完全图有 N × ( N − 1 ) N\times (N-1) N×(N1)条边。( )

A.正确

B.错误

【答案】:B

【解析】

全完全的边数= N × ( N − 1 ) / 2 N\times (N-1)/2 N×(N1)/2

第20题

为解决哈希函数冲突,在哈希表项内设置链表存储该项内的所有冲突元素,则该哈希表内查找元素的最差时间复杂度为O(1)。( )

A.正确

B.错误

【答案】:B

【解析】

最坏肯定不是O(1),最好是O(1)就不错了

第21题

求一个包含v个顶点、e条边的带权连通无向图的最小生成树, Prim算法的时间复杂度为O(v * e)。( )

A.正确

B.错误

【答案】:B

【解析】

时间复杂度一般和节点有关,与边无关

第22题

已知int类型的变量a、b和c中分别存储着一个三角形的三条边长, 则这个三角形的面积可以通过表达式sqrt((a+b+c) * (b+c-a) * (a+c-b) * (a+b-c)) / 4求得。( )

A.正确

B.错误

【答案】:A

【解析】

海伦公式

第23题

可以使用深度优先搜索算法判断图的连通性。( )

A.正确

B.错误

【答案】:A

【解析】

可以使用dfs深搜找到连通图

第24题

在N个元素的二叉排序树中查找一个元素, 平均情况的时间复杂度是O(logN) 。()

A.正确

B.错误

【答案】:A

【解析】

基本概念

第25题

给定double类型的变量x, 且其值大于等于1, 我们可以通过二分法求出logx的近似值。( )

A.正确

B.错误

【答案】:A

【解析】

基本概念,二分答案的方法

编程题

第26题 公倍数问题

【题目描述】

小A写了一个 N × M N\times M N×M的矩阵A, 我们看不到这个矩阵, 但我们可以知道, 其中第i行第j列的元素 A i , j A_{i,j} Ai,j是i和j的公倍数(i=1, …, N, j=1, …, M) 。现在有K个小朋友,其中第k个小朋友想知道,矩阵A中最多有多少个元素可以是k(k=1,2,…,K)。请你帮助这些小朋友求解。

注意:每位小朋友的答案互不相关,例如,有些位置既可能是x,又可能是y,则它同可以时满足x,y两名小朋友的要求。

方便起见,你只需要输出 ∑ k = 1 K k × a n s k \sum_{k=1}^{K}k\times ans_k k=1Kk×ansk即可, 其中 a n s k ans_k ansk表示第k名小朋友感兴趣的答案。

【输入】

第一行三个正整数N,M,K。

【输出】

输出一行,即 ∑ k = 1 K k × a n s k \sum_{k=1}^{K}k\times ans_k k=1Kk×ansk

请注意, 这个数可能很大, 使用C++语言的选手请酌情使用long long等数据类型存储答案。

【输入样例】

2 5 2

【输出样例】

9

【代码详解】

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, m, k, ans;
int a[1000005], b[1000005];
void count_divisor(int n, int divisor[])  // 预处理,求1~1000000个数,最大值为n的因数个数
{
    for (int i=1; i<=n; i++) {  // 类似埃氏筛法
        for (int j=i; j<=1000000; j+=i) {
            divisor[j] += 1;  // 计算因数个数
        }
    }
}
signed main()
{
    cin >> n >> m >> k;
    count_divisor(n, a);  // 分别处理最大值为n和m的因数个数数组,保存在a和b两个数组中
    count_divisor(m, b);

    for (int i=1; i<=k; i++) {  // 按照题意遍历1...k
        ans += i * a[i] * b[i];  // 将行坐标i的因数个数 * 列坐标i的因数个数 * i
        // cout << "ans " << ans << endl;
    }
    cout << ans << endl;
    return 0;
}

【运行结果】

2 5 2
9

第27题 接竹竿

【题目描述】

小杨同学想用卡牌玩一种叫做“接竹竿"的游戏。

游戏规则是:每张牌上有一个点数v,将给定的牌依次放入一列牌的末端。若放入之前这列牌中已有与这张牌点数相同的牌,则小杨同学会将这张牌和点数相同的牌之间的所有牌全部取出队列(包括这两张牌本身)。

小杨同学现在有一个长度为n的卡牌序列A, 其中每张牌的点数为 A j ( 1 ≤ i ≤ n ) A_j(1\le i\le n) Aj(1in) 。小杨同学有q次询问。第i次 ( 1 ≤ i ≤ q ) (1\le i\le q) (1iq)询问时, 小杨同学会给出 l i , r i l_i,r_i li,ri,小杨同学想知道如果用下标在 [ l i , r i ] [l_i, r_i] [li,ri]的所有卡牌按照下标顺序玩“接竹竿"的游戏, 最后队列中剩余的牌数。

【输入】

第一行包含一个正整数T,表示测试数据组数。

对于每组测试数据,第一行包含一个正整数n,表示卡牌序列A的长度。

第二行包含n个正整数 A 1 , A 2 , … , A n A_1, A_2, \dots, A_n A1,A2,,An,表示卡牌的点数A。

第三行包含一个正整数q,表示询问次数。

接下来q行,每行两个正整数 l i , r i l_i,r_i li,ri,表示一组询问。

【输出】

对于每组数据, 输出q行。第i行 ( 1 ≤ i ≤ q ) (1\le i\le q) (1iq)输出一个非负整数,表示第i次询问的答案。

【输入样例】

1
6
1 2 2 3 1 3
4
1 3
1 6
1 5
5 6

【输出样例】

1
1
0
2

【代码详解】

#include <bits/stdc++.h>
using namespace std;
#define int register unsigned  // #11号测试点需要加这句,否则TLE
unsigned t, n, q;  // 加了#define后,int要修改为unsigned
signed main()  // 加了#define后,int要修改为signed
{
    scanf("%d", &t);
    while (t--) {
        int a[15]={}, nxt[100005]={};
        scanf("%d", &n);
        for (int i=1; i<=n; i++) {
            int x;
            scanf("%d", &x);
            nxt[a[x]] = i;  // 记录距离a[x](位置)最近的位置
            a[x] = i;  // 记录x的位置
          
        }
        scanf("%d", &q);
      
        while (q--) {
            int ans = 0;
            int st, ed;
            scanf("%d%d", &st, &ed);
            for (int i=st; i<=ed; i++) {
                if (nxt[i]<st || nxt[i]>ed)
                    ans++;  // 如果不在范围内,这张牌就会留下来,计数器加1
                else
                    i = nxt[i];
            }
            printf("%d\n", ans);
        }
    }
    return 0;
}

【运行结果】

1
6
1 2 2 3 1 3
4
1 3
1
1 6
1
1 5
0
5 6
2
  • 34
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值