中国电子学会(CEIT)2021年09月真题C语言软件编程等级考试四级(含详细解析答案)

中国电子学会(CEIT)考评中心历届真题(含解析答案)

C语言软件编程等级考试四级 2021年09月

编程题四道							总分:100分

一、吃奶酪(25分)
Jerry准备偷吃Tom的奶酪。所有的奶酪排成了一条直线,每块奶酪都有不同的美味程度。然而,如果有相邻两块奶酪都被Jerry偷吃,Tom就会发现这一点并迅速抓住Jerry。Jerry当然希望在不被Tom发现的条件下吃到的奶酪美味度总和最大。当然,他也可以选择一块奶酪都不吃。请你帮助他规划一下偷吃的方案,告诉他最多能偷吃到多少的美味度吧。
时间限制: 1000ms
内存限制: 65536kb
输入
第一行一个整数T(T<=100),表示测试数据组数。
接下来,每组测试数据包含两行。其中,第一行一个整数n (1<= n <= 100,000),表示奶酪的数量;第二行n个整数,表示这一排直线上奶酪的美味程度,请注意,美味度保证能够被int类型存储,且可能是负数。
输出
对于每组测试数据,输出一个整数,表示Jerry可以吃到的最大美味度总和。请注意,美味度总和可能超过int存储范围。
样例输入

2
4
1 2 3 1
5
2 7 9 3 1

样例输出

4
12
// 引入cstring库,用于处理字符串操作,这里主要是用于memset函数。
#include <cstring>
// 引入iostream库,用于输入输出操作。
#include <iostream>
// 使用std命名空间,避免在调用库函数时重复写std::。
using namespace std;// 定义两个全局数组d和a,分别用于存储动态规划的结果和输入的数值。
long long d[100005], a[100005];// 主函数入口。
int main() {// 定义变量t, n, c,分别用于存储测试用例的数量、每个测试用例的数字数量和结果的数量。int t, n, c = 0;// 定义数组r,用于存储每个测试用例的结果。long long r[100];// 从标准输入读取测试用例的数量。cin >> t;// 对于每个测试用例:while (t--) {// 使用memset函数初始化数组d和a为0。memset(d, 0,sizeof(d));memset(a, 0,sizeof(a));// 从标准输入读取数字的数量。cin >> n;// 对于每个数字:for (int i = 1; i <= n; i++)// 从标准输入读取该数字,并存储到数组a中。cin >> a[i];// 初始化动态规划的前两个值。d[1] = max(0,(int)a[1]);d[2] = max(int(d[1]), (int)a[2]);// 使用动态规划计算最大的非相邻数字之和。for (int i = 3; i <= n; i++){d[i]= max(d[i - 1], a[i] + d[i - 2]);}// 将当前测试用例的结果存储到数组r中。r[c++] = d[n];}// 输出每个测试用例的结果。for (int i = 0; i < c; i++)cout <<r[i]<< endl;// 程序结束,返回0。return 0;
}
/*这个程序的核心是使用动态规划来解决“打家劫舍”问题。它首先读取测试用例的数量,然后对于每个测试用例,读取数字的数量和具体的数字,然后使用动态规划计算最大的非相邻数字之和,并将结果存储起来。最后,它输出每个测试用例的结果。
*/

二、奶牛散步(25分)
从一个无限大的矩阵的中心点出发,一步只能向右走、向上走或向左走。恰好走N步且不经过已走的点共有多少种走法?
时间限制: 10000ms
内存限制: 131072kb
输入
一个数字,代表N,N <= 1000。输出
输出有多少方案。
样例输入

2

样例输出

7
#include <iostream> // 引入输入输出流库
using namespace std; // 使用标准命名空间int main() {int n, i = 0; // 定义整数n和i,并将i初始化为0cin >> n; // 从标准输入读取一个整数到nlong long lr = 2, up = 1; // 定义长整型变量lr和up,分别初始化为2和1long long t_lr = 0, t_up = 0; // 定义长整型变量t_lr和t_up,用于临时存储上一步的值if (n == 1){ // 如果n等于1cout << 3; // 输出3}else { // 否则for (i = 2; i <= n; i++){ // 从2循环到nt_lr = lr; // 将当前lr的值赋给t_lrt_up = up; // 将当前up的值赋给t_uplr = (t_up * 2 + t_lr) % 12345; // 更新lr的的值,根据规则计算并取模12345up = (t_up + t_lr) % 12345; // 更新up的值,根据规则计算并取模12345}cout << (up + lr) % 12345; // 输出最终up和lr的和,取模12345}return 0; // 程序正常结束,返回0
}
/*它读取一个整数n,并根据给定的规则计算出一系列的值,最后输出一个取模12345的结果。规则基于用户提供的移动方案:如果上一步向上走,下一步可以向左、右、上。如果上一步向左走,下一步可以向左、上。如果上一步向右走,下一步可以向右、上。程序首先检查n是否为1,如果是,则直接输出3。如果n大于1,程序会进入一个循环,在循环中,它会更新两个变量lr和up,这两个变量分别代表左右和上步的方向的累计值。在每次迭代中,t_lr和t_up被用来存储前一步的lr和up的值,然后根据规则更新lr和up。在循环结束后,程序输出up和lr的和,并取模12345。这个取模操作可能用于防止整数溢出,也可能是为了满足某种特定的输出要求。需要注意的是,此代码片段中的规则并没有在代码中明确表示出上一步的方向,而是通过变量lr和up的更新来隐含地表示。另外,初始值lr=2和up=1可能代表某种特定的初始状态或方向,但代码中并未给出具体的解释。
*/

三、数字构造(25分)
火山宝打算造一个n位的十进制数字出来。
对于1到n中的每一个i,火山宝可以从xi、1、…、xi、ki这ki个0-9的数字中选择一个作为ai。
在选择结束后,a1a…an形成了一个n位的十进制数,这就是火山宝造出来的数。你需要帮火山宝计算他能造出的数中,有多少个是3的倍数。
时间限制: 1000ms
内存限制: 65536kb
输入
第一行输入一个整数n ( 1=<n<=18),表示数字的位数。
接下来n行,每行第一个整数ki (1=<k<=10),表示第i中候选的数字数量。
接着是ki个两两不同的O-9范围内的数字xi、1、…、.xi、ki。输入保证O不是第一位的可选项。
输出
你需要输出一行一个整数,表示火山宝能造出的数字中,3的倍数的数量。样例输入
样例输入1:

2
5 5 6 7 8 9
5 0 1 2 3 4

样例输入2:

5
9 1 2 3 4 5 6 7 8 9
10 0 1 2 3 4 5 6 7 8 9
10 0 1 2 3 4 5 6 7 8 9
10 0 1 2 3 4 5 6 7 8 9
10 0 1 2 3 4 5 6 7 8 9
10 0 1 2 3 4 5 6 7 8 9

样例输出
样例输出1:

9

样例输出2:

30000

提示
样例1能造出来的3的倍数有51、54、60、63、72、81、84、90、93。

#include <cstring>  // 引入cstring库,用于字符串处理,虽然在这段代码中并未使用到
#include <iostream> // 引入iostream库,用于输入输出操作
using namespace std; // 使用标准命名空间int k[20], num[20][10], mod[20][3]; // 声明三个全局数组,k用于存储序列长度,num用于存储序列中的数,mod用于统计模3的结果int main() { // 主函数开始int n; // 声明一个整型变量n,用于存储序列的数量cin >> n; // 从标准输入读取序列的数量for (int i = 0; i < n; i++){ // 遍历每个序列cin >> k[i]; // 读取当前序列的长度for (int j = 0; j < k[i]; j++){ // 遍历当前序列的每个数cin >> num[i][j]; // 读取当前数mod[i][num[i][j] % 3]++; // 统计当前数模3的结果,并对应位置计数加1}}long result[3]= {}; // 声明并初始化一个长整型数组result,用于存储最终的模运算结果// 初始化result为第一个序列的模3运算结果for (int i = 0; i < 3; i++)result[i] = mod[0][i];// 对每个序列进行模运算,并更新resultfor (int i = 1; i< n; i++){long temp0 = result[0], temp1 = result[1], temp2 = result[2]; // 保存result的当前值// 根据当前序列的模3运算结果更新resultresult[0] = temp0 * mod[i][0] + temp1 * mod[i][2] + temp2 * mod[i][1];result[1] = temp0 * mod[i][1] + temp1 * mod[i][0] + temp2 * mod[i][2];result[2] = temp0 * mod[i][2] + temp1 * mod[i][1] + temp2 * mod[i][0];}cout << result[0] << endl; // 输出最终的模运算结果return 0; // 程序结束
}
/*简单来说,这个程序是接收多个序列,每个序列包含若干个整数,然后对每个序列进行模3运算,并将每个序列的模运算结果累加到之前的结果上,最后输出最终的模运算结果。
*/

四、最佳路径(25分)
如下所示的由正整数数字构成的三角形:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。你的任务就是求出最佳路径上的数字之和。
注意:路径上的每一步只能从一个数走到下一层上和它最近的下边(正下方)的数或者右边(右下方)的数。
时间限制: 1000ms
内存限制: 65536kb
输入
第一行为三角形高度100>=h>=1,同时也是最底层边的数字的数目。从第二行开始,每行为三角形相应行的数字,中间用空格分隔。
输出
最佳路径的长度数值。
样例输入

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

样例输出

30

提示:如何采用动态规划的思想,对问题进行分解。

#include<stdio.h> // 引入标准输入输出库// 定义二维数组dp,其中dp[i][j]表示从第i行第j列开始走到底层的最佳路径长度。
// 最终目标是计算dp[1][1],即从左上角开始走到底层的最佳路径长度。// 定义一个辅助函数max,用于返回两个整数中的较大值。
int max(int x, int y) {if (x > y)return x; // 如果x大于y,返回xreturn y; // 否则返回y
}int main() {int i, j, n; // 定义循环变量和楼层数nint arr[105][105], dp[105][105]; // 定义输入数组arr和动态规划数组dp,均为105x105大小// 读取楼层数nscanf("%d", &n);// 读取每一层的值到arr数组中for (i = 1; i <= n; ++i) {for (j = 1; j <= i; ++j) {scanf("%d", &arr[i][j]);}}// 初始化最后一层的dp值,因为从最后一层开始计算最佳路径for (i = 1; i <= n; ++i) {dp[n][i] = arr[n][i];}// 从倒数第二层开始,逐层向上计算dp数组的值for (i = n - 1; i >= 1; --i) {for (int j = 1; j <= i; ++j) {// 根据动态转移方程计算dp[i][j]的值dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + arr[i][j];}}// 输出最终结果,即dp[1][1]的值printf("%d", dp[1][1]);return 0; // 程序结束
}
/*这段代码实现了一个动态规划问题,通常被称为“最佳路径和”问题。给定一个由非负整数构成的楼梯形状数组arr,每个数字表示对应位置上的阶梯高度。从左上角(arr[1][1])开始走到右下角(arr[n][n]),每次只能向右或向下移动一步,求所有路径中最大的路径和。代码的主要逻辑如下:初始化输入数组arr和动态规划数组dp。读取楼梯的层数n和每一层的阶梯高度。初始化最后一层的dp值,因为从最后一层开始,路径只有一种选择。从倒数第二层开始,使用动态规划的方法逐层向上计算dp数组的值。输出左上角dp[1][1]的值,即从左上角到右下角的最佳路径和。
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/782375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

回溯算法|216.组合总和III

力扣题目链接 class Solution { private:vector<vector<int>> result; // 存放结果集vector<int> path; // 符合条件的结果// targetSum&#xff1a;目标和&#xff0c;也就是题目中的n。// k&#xff1a;题目中要求k个数的集合。// sum&#xff1a;已经收集…

OpenKylin安装Kafka

一、操作系统 openKylin 1.0.1 X86 二、下载安装包 # 安装依赖jdk sudo apt-get update sudo apt-get install default-jdk # 下载kafka mkdir -p /data/software/kafka wget https://archive.apache.org/dist/kafka/2.4.1/kafka_2.13-2.4.1.tgz三、解压安装 # 解压缩Kafka…

springboot项目学习-瑞吉外卖(4)续

1.任务 菜品的添加功能(涉及到两张表的数据添加) 2.菜品添加 功能页面如上&#xff0c;该页面有两个注意点 菜品分类&#xff1a;点击菜品分类后&#xff0c;会展示当前已有菜品&#xff1a;这个功能的实现要从category表里查询数据&#xff0c;然后再做展示口味做法配置&#…

算法题->移动零的C语言和JAVA的双指针解法

使用C语言和JAVA代码通过双指针进行解题 题目描述:给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 理解题意:不改变数组中非零元素的顺序,并把0元素放在非零元素后面. 链接: https://leetcode.cn/problems/m…

Linux——将云服务器作为跳板机,frp实现内网穿透

文章目录 操作步骤1. 准备工作&#xff1a;2. 配置frp服务器端&#xff1a;3. 配置frp客户端&#xff1a;4. 启动frp客户端&#xff1a;5. 测试连接&#xff1a;6. 安全注意事项&#xff1a; 云服务器性能分析阿里云具体操作步骤1. 购买&#xff1a;2. 登录&#xff1a;3. 首次…

【springboot】闲话 springboot 的几种异步机制 及 长轮询的概念和简单实现

文章目录 引子springboot的几种异步形式开启异步支持和线程池配置&#xff08;重要&#xff09;第一种&#xff1a;Async第二种&#xff1a;Callable<T>第三种&#xff1a;WebAsyncTask<T>第四种&#xff1a;DeferredResult<T> 长轮询的简单实现概念实现服务…

spring boot-引入Redis并封装redistemplate操作工具类

文章目录 一、关于spring-redis二、springboot引入Redis及其使用案例三、封装redistemplate操作工具类 一、关于spring-redis spring-data-redis针对jedis提供了如下功能&#xff1a; 连接池自动管理&#xff0c;提供了一个高度封装的“RedisTemplate”类 针对jedis客户端中大…

设置 Linux 时间同步 同步硬件时钟

设置 Linux 时间同步 同步硬件时钟 配置 NTP 客户端查看当前系统时间使用 ntpdate 命令手动同步时间同步硬件时钟再次检查硬件时钟参考 配置 NTP 客户端 vim /etc/systemd/timesyncd.conf[Time] NTPcn.pool.ntp.org FallbackNTPasia.pool.ntp.org ntp.aliyun.com ntp1.aliyun.…

acwing算法提高之图论--单源最短路的扩展应用

目录 1 介绍2 训练 1 介绍 本专题用来记录使用。。。。 2 训练 题目1&#xff1a;1137选择最佳线路 C代码如下&#xff0c; #include <iostream> #include <cstring> #include <algorithm> #include <queue>using namespace std;const int N 101…

编译amd 的 amdgpu 编译器

1,下载源码 git clone --recursive https://github.com/ROCm/llvm-project.git 2, 配置cmake cmake -G "Unix Makefiles" ../llvm \ -DLLVM_ENABLE_PROJECTS"clang;clang-tools-extra;compiler-rt" \ -DLLVM_BUILD_EXAMPLESON …

springboot企业级抽奖项目业务四 (缓存预热)

缓存预热 为什么要做预热: 当活动真正开始时&#xff0c;需要超高的并发访问活动相关信息 必须把必要的数据提前加载进redis 预热的策略: 在msg中写一个定时任务 每分钟扫描一遍card_game表 把(开始时间 > 当前时间)&& (开始时间 < 当前时间1分钟)的活动及相…

CrossOver软件2024免费 最新版本详细介绍 CrossOver软件好用吗 Mac电脑玩Windows游戏

CrossOver是一款由CodeWeavers公司开发的软件&#xff0c;它可以在Mac和Linux等操作系统上运行Windows软件&#xff0c;而无需在计算机上安装Windows操作系统。这款软件的核心技术是Wine&#xff0c;它是一种在Linux和macOS等操作系统上运行Windows应用程序的开源软件。 Cross…

大语言模型---强化学习

本文章参考&#xff0c;原文链接&#xff1a;https://blog.csdn.net/qq_35812205/article/details/133563158 SFT使用交叉熵损失函数&#xff0c;目标是调整参数使模型输出与标准答案一致&#xff0c;不能从整体把控output质量 RLHF&#xff08;分为奖励模型训练、近端策略优化…

HarmonyOS 应用开发之FA模型绑定Stage模型ServiceExtensionAbility

本文介绍FA模型的三种应用组件如何绑定Stage模型的ServiceExtensionAbility组件。 PageAbility关联访问ServiceExtensionAbility PageAbility关联访问ServiceExtensionAbility和PageAbility关联访问ServiceAbility的方式完全相同。 import featureAbility from ohos.ability…

Adaboost集成学习 | Matlab实现基于ELM-Adaboost极限学习机结合Adaboost集成学习时间序列预测(股票价格预测)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 基于ELM-Adaboost极限学习机结合Adaboost集成学习时间序列预测(股票价格预测) 单变量时间序列单步预测。 ELM(Extreme Learning Machine,极限学习机)和AdaBoost(Adaptive Boosting,自适应提升)都是机…

c++----list模拟实现

目录 1. list的基本介绍 2. list的基本使用 2.1 list的构造 用法示例 2.2 list迭代器 用法示例 2.3. list容量&#xff08;capacity&#xff09;与访问&#xff08;access) 用法示例 2.4 list modifiers 用法示例 2.5 list的迭代器失效 3.list的模拟实现 3.1…

使用Python实现ID3决策树中特征选择的先后顺序,字节跳动面试真题

def empty1(pri_data): hair [] #[‘长’, ‘短’, ‘短’, ‘长’, ‘短’, ‘短’, ‘长’, ‘长’] voice [] #[‘粗’, ‘粗’, ‘粗’, ‘细’, ‘细’, ‘粗’, ‘粗’, ‘粗’] sex [] #[‘男’, ‘男’, ‘男’, ‘女’, ‘女’, ‘女’, ‘女’, ‘女’] for o…

leetcode.209.长度最小的子数组

题目 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 输入&#xff1a;s 7, nums [2,3,1,2,4,3] 输出&#…

sqli第24关二次注入

注入点 # Validating the user input........$username $_SESSION["username"];$curr_pass mysql_real_escape_string($_POST[current_password]);$pass mysql_real_escape_string($_POST[password]);$re_pass mysql_real_escape_string($_POST[re_password]);if($p…

wps斜线表头并分别打字教程

wps斜线表头怎么做并分别打字&#xff1a; 1、首先选中我们想要设置的表头。 2、接着右键选中它&#xff0c;点击“设置单元格格式” 3、然后点击上方“边框”选项卡。 4、随后选择图示的斜线&#xff0c;点击“确定” 5、设置完成后&#xff0c;我们只要在其中打字就可以在斜…