第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.04、第三步:相加
7.0710678 + 3.0 = 10.07106785、第四步:强制类型转换
代码最后有
(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、本题总结
| 函数 | 返回类型 |
|---|---|
| sqrt | double |
| pow | double |
| sin | double |
| cos | double |
| log | double |
| log2 | double |
以及:
三角函数使用弧度。
第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) =7i=3
max(7,2+9) =11i=4
max(11,7+3) =11i=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题知识点总结
| 题号 | 知识点 | 必须掌握 |
|---|---|---|
| 1 | sqrt、log2、强制类型转换 | 理解double与(int)截断 |
| 2 | 数学函数 | 所有数学函数大多返回double,三角函数使用弧度 |
| 3 | 函数参数传递 | 值传递、引用传递、指针传递的区别 |
| 4 | 哈夫曼树 | 每次合并最小两个结点,计算最小 WPL |
| 5 | 二维 DP | 网格路径最大值状态转移 |
| 6 | 线性 DP | 经典“打家劫舍”状态转移 |
| 7 | 01 背包 | 一维优化公式与倒序枚举容量的原因 |
这 7 道题覆盖了七级考试中最核心的基础算法知识,尤其是动态规划(第5、6、7题),几乎每次 GESP 七级都会涉及,建议重点掌握。