CSP-J 2024 入门级 第一轮(初赛) 阅读程序(2)

该文章已生成可运行项目,

【题目】

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。
根据递推的初始状态和状态转移方程,完成递推
可以使用列表法完成递推

icost[i]dp[i]
0100
11510
22015
330

输出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,列表递推

icost[i]dp[i]
010
11001
21100
312
413
51003
61103
714
81005
91104
106

输出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,列表递推

icost[i]dp[i]
0100
11510
23015
3540
4520
51025
62030
745

输出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,列表递推

icost[i]dp[i]
050
1105
21510
320

输出min(dp[3], dp[2]) = 10,选A。

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值