视频讲解:GESP2026年3月四级C++真题讲解

一、单选题

第1题

解析:

答案B,

f()无参数默认为2,输出2*3=6
f(4),输出4*3=12

第2题

解析:

答案B,

int** q = &p;  二级指针q 指向 一级指针p 
**q += 7;// 等价与 *p+=7   或 a+=7

第3题

解析:

答案B,

int (*p)[4]=a; //代表“行指针”,指向{1,2,3,4}的第一个元素
*(p+2) 代表行+2
*(*(p+2)+1)代表行+2基础上,列+1
即a[0+2][0+1]=a[2][1]=10

第4题

解析:

答案B,

x值传递(原数据不改变),y引用传递(原数据改变),z指针传递(原数据改变)

第5题

解析:

答案A,

第6题

解析:

答案B,

结构体常见3种 初始化方式
等号形式:Point p={1,2};
大括号形式:Point p{1,2};
指针形式:Point* p = new Point{1,2}

第7题

解析:

答案B,

g()函数值传递,不改变原数据,所以a还是1
h()函数引用传递,改变原数据,所以b变12

第8题

解析:

答案B,

ACD都是递归的描述

第9题

解析:

答案B,这是解决斐波那契数列:1 2 3 5 8 13 ...

第10题

解析:

答案B,排序后,A  B  D的相对位置不变,是稳定排序

第11题

解析:

答案B,插入排序实现升序,比key大才进行后移

第12题

解析:

答案C,i循环n次,j嵌套循环n次,时间复杂度=n*n=n²

第13题

解析:

答案B,

第14题

解析:

答案B,divi(10,0),0为除数,throw 0; 返回int类型,输出B

第15题

解析:

答案A,

排行榜是降序,分数增加向前排,所以最多排到第一,即i>0
排行榜是降序,分数增加向前排,所以当前分数>前面的,才后移,即cur.score>players[i-1].score

二、判断题

第1题

解析:

答案√,引用传递会改变原数据

第2题

解析:

答案√,

第3题

解析:

答案×,

数组的顺序
a[0][0]  a[0][1]  a[0][2]  a[1][0]  a[1][1]  a[1][2]
a[1][2]  和  a[0][1] 相差4个位置,输出4

第4题

解析:

答案×,

调用函数calc(5)
以下两个函数定义都可调用,导致冲突
int calc(int x,int y=10)
int calc(int x)

第5题

解析:

答案√,

第6题

解析:

答案×,全局指针  和 静态指针才会自动初始化

#include <bits/stdc++.h>
using namespace std;
int *p1;//全局指针 
int main(){
	static int* p2;//静态指针 
}

第7题

解析:

答案√,结构体可以嵌套定义

第8题

解析:

答案×,应该为fout<<"Hello";

第9题

解析:

答案×,

选择排序:任何场景下,复杂度固定
插入排序:更适合相对有序的数据

第10题

解析:

答案×,该代码用单层for实现斐波那契数列,复杂度为O(n)

三、编程题

第1题 [GESP202603 四级] 山之谷

题目描述

现有一片山地,可以视为一个 N 行 M 列的网格图,第 i 行 j 列的海拔为 hi,j​。

如果一个单元格的海拔不高于其所有相邻单元格(相邻包括上、下、左、右、左上、右上、左下、右下,最多 8 个方向)的海拔,则称该单元格为山谷。

请你数一数该片山地中有多少山谷。

输入格式

第一行包含 2 个整数 N,M,表示山地的大小。

之后 N 行,每行包含 M 个整数 hi,1​,hi,2​,⋯,hi,M​,表示海拔。

输出格式

输出 1 行,包含 1 个整数 C,表示山谷的数量。

输入输出样例

输入 #1

3 5
7 6 6 7 9
6 5 6 7 6
6 5 7 8 9

输出 #1

3

说明/提示

样例解释

样例 1 如图所示,绿色单元格代表山谷:

数据范围

保证 1 ≤ N,M ≤ 100,1 ≤ hi,j ​≤ 10^{5}。

答案

#include<bits/stdc++.h>
using namespace std;
int a[105][105];
bool check(int x,int y){
	for(int i=x-1;i<=x+1;i++)
		for(int j=y-1;j<=y+1;j++)
			if(a[i][j] < a[x][y] ) return 0;
	return 1;
}
int main(){
	//1)填充数据
	int n,m;cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	//2)边缘改成max
	for(int i=0;i<=n+1;i++) a[i][0]=100005,a[i][m+1]=100005;
	for(int j=0;j<=m+1;j++) a[0][j]=100005,a[n+1][j]=100005;
	//3)计算 山谷的数量 
	int ans=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(  check(i,j)  ) ans++;
	cout<<ans;
	return 0; 
}  










第2题 [GESP202603 四级] 礼盒排序

题目描述

商店推出了许多礼盒,每个礼盒中包含 k 件商品,每件商品都有一个价格。

现在需要对这些礼盒进行排序,排序规则如下:

  1. 先按礼盒总价格从小到大排序;
  2. 如果总价格相同,按礼盒中最贵商品的价格从小到大排序;
  3. 如果仍然相同,按礼盒中最便宜商品的价格从小到大排序;
  4. 如果仍然相同,按礼盒编号从小到大排序。

请输出排序后的礼盒编号。

输入格式

第一行包含两个整数 n 和 k,分别表示礼盒数量和每个礼盒中商品的数量。

接下来 n 行,每行包含 k 个整数,第 i 行表示第 i 个礼盒中各商品的价格。

输出格式

输出一行,包含排序后的礼盒编号(编号从 1 开始),用空格分隔。

输入输出样例

输入 #1

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

输出 #1

3 4 2 1

说明/提示

样例解释

编号商品价格总价最大值最小值
13 5 21052
24 1 51051
32 2 4842
43 4 31043

排序过程:

  1. 按总价排序,3 号礼盒总价最小;
  2. 其余总价均为 10,再按最大值排序,4 号最大值更小;
  3. 1 号和 2 号最大值相同,再按最小值排序,2 号更小。

最终顺序为:3 4 2 1

数据范围

保证 1 ≤ n ≤ 10^{3},1 ≤ k ≤ 10,1 ≤  商品价格  ≤ 10^{4}。

答案

#include<bits/stdc++.h>
using namespace std;
struct goods{
	int sum,maxx,minn,id;
}a[1005];
bool cmp(goods a,goods b){
	if(a.sum != b.sum) return a.sum < b.sum;
	if(a.maxx != b.maxx) return a.maxx < b.maxx;
	if(a.minn != b.minn) return a.minn < b.minn;
	return a.id < b.id;
}
int main(){
	//1)填充数据
	int n,k;cin>>n>>k;
	for(int i=1;i<=n;i++){
		a[i].sum=0;
		a[i].maxx=INT_MIN;
		a[i].minn=INT_MAX;
		for(int j=1;j<=k;j++){
			int temp;cin>>temp;
			a[i].sum+=temp;
			if(a[i].maxx<temp) a[i].maxx=temp;
			if(a[i].minn>temp) a[i].minn=temp;
		}	
		a[i].id=i;
	}
	//2)根据排序规则排序 
	sort(a+1,a+n+1,cmp);
	//3)输出排序后的礼盒id 
	for(int i=1;i<=n;i++) cout<<a[i].id<<" ";
	return 0; 
}  










更多推荐