【题目】
CSP-J 2024 入门级 第一轮(初赛) 阅读程序(2)
1 #include <iostream>
2 #include <vector>
3 using namespace std;
4
5 int compute(vector<int> &cost) {
6 int n = cost.size();
7 vector<int> dp(n + 1, 0);
8 dp[1] = cost[0];
9 for (int i = 2; i <= n; i++) {
10 dp[i] = min(dp[i - 1], dp[i - 2]) + cost[i - 1];
11 }
12 return min(dp[n], dp[n - 1]);
13 }
14
15 int main() {
16 int n;
17 cin >> n;
18 vector<int> cost(n);
19 for (int i = 0; i < n; i++) {
20 cin >> cost[i];
21 }
22 cout << compute(cost) << endl;
23 return 0;
24 }
判断题
1. 当输入的 cost 数组为{10,15,20}时,程序的输出为 15( )
2. 如果将 dp[i-1]改为 dp[i-3],程序可能会产生编译错误( )
3. 程序总是输出 cost 数组种的最小的元素( )
单选题
4. 当输入的 cost 数组为{1,100,1,1,1,100,1,1,100,1}时,程序的输出为()。
A.“6”
B.“7”
C.“8”
D.”9”
5. 如果输入的 cost 数组为{10,15,30,5,5,10,20},程序的输出为()
A.”25”
B.“30”
C."35”
D.“40”
6. 若将代码中的 min(dp[i-1],dp[i-2])+cost[i-1]修改为 dp[i-1]+cost[i-2],输入 cost 数组为
{5,10,15}时,程序的输出为()
A.”10”
B.“15”
C."20”
D.“25”
【题目考点】
1. 递推
2. STL vector
vector构造函数:
vector<元素类型> 对象名(元素个数,初始值)
例:
vector<int> v(10, 3);
生成一个vector<int>类型的对象v,其中包含10个元素,每个元素都是3。也就是说v.size()为10,v[0]~v[9]都是3。
【解题思路】
没有题目背景,难以理解该问题的状态定义。直接当做递推问题来看。
先输入cost数组,下标从0~n-1。
状态数组是dp。
初值:dp[0] = 0,dp[1] = cost[0]
状态转移方程:dp[i] = min(dp[i-1], dp[i-2])+cost[i-1];
最后结果为:dp[n]和dp[n-1]的较小值。
【试题答案及解析】
判断题
1. 当输入的 cost 数组为{10,15,20}时,程序的输出为 15( )
答:T
cost数组有3个元素,那么n=3。
根据递推的初始状态和状态转移方程,完成递推
可以使用列表法完成递推
| i | cost[i] | dp[i] |
|---|---|---|
| 0 | 10 | 0 |
| 1 | 15 | 10 |
| 2 | 20 | 15 |
| 3 | 30 |
输出min(dp[3], dp[2])=15,叙述正确。
2. 如果将dp[i-1]改为 dp[i-3],程序可能会产生编译错误( )
答:F
将dp[i-1]改为dp[i-3]后,当i为2时,执行到这一句dp[i] = min(dp[i-3], dp[i-2])+cost[i-1];
其中dp[i-3]的下标为-1,数组下标越界,会产生运行时错误,而不是编译错误。
3. 程序总是输出 cost 数组种的最小的元素( )
答:F
第1题的结果15就不是cost数组的最小元素。
单选题
4. 当输入的 cost 数组为{1,100,1,1,1,100,1,1,100,1}时,程序的输出为()。
A.“6”
B.“7”
C.“8”
D.“9”
答:A
n=10,列表递推
| i | cost[i] | dp[i] |
|---|---|---|
| 0 | 1 | 0 |
| 1 | 100 | 1 |
| 2 | 1 | 100 |
| 3 | 1 | 2 |
| 4 | 1 | 3 |
| 5 | 100 | 3 |
| 6 | 1 | 103 |
| 7 | 1 | 4 |
| 8 | 100 | 5 |
| 9 | 1 | 104 |
| 10 | 6 |
输出min(dp[10], dp[9])=6,选A。
5. 如果输入的 cost 数组为{10,15,30,5,5,10,20},程序的输出为()
A.“25”
B.“30”
C.“35”
D.“40”
答:B
n=7,列表递推
| i | cost[i] | dp[i] |
|---|---|---|
| 0 | 10 | 0 |
| 1 | 15 | 10 |
| 2 | 30 | 15 |
| 3 | 5 | 40 |
| 4 | 5 | 20 |
| 5 | 10 | 25 |
| 6 | 20 | 30 |
| 7 | 45 |
输出min(dp[7], dp[6])=30,选B。
6. 若将代码中的min(dp[i-1],dp[i-2])+cost[i-1]修改为 dp[i-1]+cost[i-2],输入cost数组为
{5,10,15}时,程序的输出为()
A.“10”
B.“15”
C.“20”
D.“25”
答:A
n=3,列表递推
| i | cost[i] | dp[i] |
|---|---|---|
| 0 | 5 | 0 |
| 1 | 10 | 5 |
| 2 | 15 | 10 |
| 3 | 20 |
输出min(dp[3], dp[2]) = 10,选A。
 阅读程序(2)&spm=1001.2101.3001.5002&articleId=142552933&d=1&t=3&u=2e6ec9b39b044f159996c340599594b5)
3172

被折叠的 条评论
为什么被折叠?



