GESP2026年6月认证C++七级( 第一部分选择题(1-7))精讲



第1题 数学函数

1、题目代码:

#include  #include  using namespace std; int main() { cout << (int)(sqrt(50) + log2(8)); return 0; }

A.9

B.10

C.11

D.12

答案:B


2、第一步:先算 sqrt(50)

sqrt(x)表示平方根。

即

=7.0710678...

注意:

sqrt返回的是double类型。

不是整数。


3、第二步:计算 log2(8)

log2(x)表示

以2为底的对数

因为

2^3=8

所以

log2(8)=3

也是一个double:

3.0

4、第三步:相加

7.0710678 + 3.0 = 10.0710678

5、第四步:强制类型转换

代码最后有

(int)

即

(int)10.0710678

变成

10

这里不会四舍五入!


而是

直接舍弃小数部分(向0截断)。

所以输出

10

答案

✅ B


6、本题知识点

需要掌握:

① sqrt()

sqrt(49)=7 sqrt(2)=1.414...

返回double


② log2()

例如

log2(2)=1 log2(4)=2 log2(8)=3 log2(16)=4

③ 强制类型转换

(int)10.99

结果

10

不是11。

有的同学这里容易错。



第2题 cmath函数

1、题目问:

下面哪个说法正确?

答案:

A、sqrt(49)的返回值可以参与浮点运算。


2、看四个选项

(1)选项A:

sqrt(49)

返回

7.0

类型是

double

当然可以继续参与浮点运算。

例如

double x=sqrt(49)+0.5;

得到

7.5

所以

A正确。


(2)选项 B:

log2(32)

结果虽然是

5

但是类型不是int。

而是

double

这一点一定牢记。

所以

B选项错误。❌️


(3)选项 C:

pow(2,5)

结果虽然等于

32

但是

返回值类型依旧是

double

不是int。


例如

cout<

会发现不是int。

所以

C选项,错误❌️。


(4)选项 D:

很多同学最容易掉坑。

sin(90)

里面的90不是90°。


数学库规定:

三角函数全部使用弧度。


即

sin(π/2)=1

如果写

sin(90)

其实表示

90弧度

不是90度。


因此

D选项错误❌️。


3、本题总结

函数返回类型
sqrtdouble
powdouble
sindouble
cosdouble
logdouble
log2double

以及:

三角函数使用弧度。



第3题 参数传递

1、答案:

C、引用形参绑定到实参后,在函数内修改引用形参通常会影响实参。


2、看四个选项

(1)A选项

形参与实参一定使用同一块内存

错误。


普通参数

void f(int x)

调用

int a=5; f(a);

这里

a

和

x

不是同一块内存。


而是

a ↓ 复制 ↓ x

所以

A错误。


(2)B选项

值传递

例如

void add(int x){ x++; }

调用

int a=5; add(a);

结束以后

a

仍然是

5

因为修改的是复制品。

所以

B错误。


(3)C选项

引用

void add(int &x){ x++; }

调用

int a=5; add(a);

实际上

x

就是

a

修改

x

就是修改

a

最终

a=6

所以

C正确。


(4)D选项

指针当然可以修改。

例如

void add(int *p){ (*p)++; }

调用

int a=5; add(&a);

结果

a=6

因此

D错误。


3、三种参数总结

方式能否修改实参
值传递不能
引用能
指针能

考试经常考。



第4题 哈夫曼树

1、答案:

D、69


2、这一题考的是

哈夫曼树(Huffman Tree)


(1)核心原则只有一句:

每次取最小的两个合并。


(2)例如

1 2 3 4 5

(3)先合并

1+2=3

得到

3 3 4 5

(4)再继续

3+3=6

不断重复。


(5)最后

所有合并值加起来

就是

WPL

在考试中,不要求现场画树,但一定要会按照优先队列(小根堆),不断合并最小权值计算 WPL。试卷给出的这一组数据按上述规则计算,最终得到D。


3、哈夫曼口诀

考试记一句:

每次找最小两个,加起来放回去。

所有合并值之和

就是

WPL


第5题 DP

1、答案:

C、dp[i][j] = a[i][j] + max(dp[i - 1][j], dp[i][j - 1])


2、题目说:

只能

向右

或者

向下

走。


3、假设来到这里

□ □ □ □ □ X

来到X只有两种可能。

(1)一种

上面 ↓ X

(2)另一种

左边 → X

(3)因此,上一状态只有两个:

dp[i-1][j] dp[i][j-1]

(4)题目要求

最大数字和

所以应该取

max

再加上当前格子的值


4、状态转移公式:

dp[i][j] = a[i][j] + max(dp[i-1][j],dp[i][j-1]);

答案是

C。


5、为什么其它错?

(1)A选项

用了

min

这是最小路径。

不是最大。


(2)B选项

根本没有加当前格子。

错误。


(3)D选项

来自左上角。

但题目不能斜着走。

错误。


6、经典模板

以后看到

向右 向下

基本都是

dp[i][j] = max(上,左) + 当前值

或者

min(上,左) + 当前值

根据题意改。



第6题 动态规划

答案:

C、12


1、题目分析

(1)状态转移:

f[i] = max(f[i-1],f[i-2]+a[i]);

是不是很眼熟?


(2)这就是

打家劫舍(House Robber)

经典DP。

意思:

到了第i个位置。

有两个选择。


① 不偷

f[i-1]

② 偷

f[i-2]+a[i]

因为相邻不能同时选。


2、现在模拟计算。

(1)初始

f0=0 f1=2

(2)数组

2 7 9 3 1

(3)计算

i=2

max(2,0+7) =7

i=3

max(7,2+9) =11

i=4

max(11,7+3) =11

i=5

max(11,11+1) =12

(4)因此

f5=12

对应答案

C。


3、记忆口诀

每次

只有两种情况:

不要当前 要当前

所以

max ( 前一个, 前两个+当前 )


第7题 01背包

答案:

D、dp[c] = max(dp[c], dp[c - w[i]] + v[i])


1、先看代码

for(int i=1;i<=n;i++) { for(int c=W;c>=w[i];c--) { ________ } }

这里是

一维优化01背包


2、核心公式必须牢记:

dp[c] = max( dp[c], dp[c-w[i]]+v[i] );

因此答案

D。


3、为什么容量要倒着循环?

(1)因为

01背包 每件只能拿一次。

(2)如果正着循环:

dp[5] 更新以后 马上 dp[6] 又用了新的dp[5]

就等于

同一件物品用了两次。

变成

完全背包。


(3)所以

必须

W ↓ w[i]

倒着更新。


4、必须牢记的公式

优化后:

for(int c=W;c>=w;c--) dp[c]=max(dp[c],dp[c-w]+v);

这是GESP经常考的01背包模板。


第一部分 1~7题知识点总结

题号知识点必须掌握
1sqrt、log2、强制类型转换理解double与(int)截断
2数学函数所有数学函数大多返回double,三角函数使用弧度
3函数参数传递值传递、引用传递、指针传递的区别
4哈夫曼树每次合并最小两个结点,计算最小 WPL
5二维 DP网格路径最大值状态转移
6线性 DP经典“打家劫舍”状态转移
701 背包一维优化公式与倒序枚举容量的原因

这 7 道题覆盖了七级考试中最核心的基础算法知识,尤其是动态规划(第5、6、7题),几乎每次 GESP 七级都会涉及,建议重点掌握。