2021年09月 C/C++(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

news2025/2/28 8:35:03

在这里插入图片描述

第1题:最佳路径

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

以下是解决该问题的C语言代码实现:

#include <stdio.h>

int maxPathSum(int triangle[][100], int N) {
    int dp[100][100] = {0};

    // 初始化最底层的dp值为三角形最底层的值
    for (int i = 0; i < N; i++) {
        dp[N - 1][i] = triangle[N - 1][i];
    }

    // 从倒数第二层开始迭代计算dp值
    for (int i = N - 2; i >= 0; i--) {
        for (int j = 0; j <= i; j++) {
            dp[i][j] = triangle[i][j] + (dp[i + 1][j] > dp[i + 1][j + 1] ? dp[i + 1][j] : dp[i + 1][j + 1]);
        }
    }

    return dp[0][0];
}

int main() {
    int N;
    scanf("%d", &N);

    int triangle[100][100];
    for (int i = 0; i < N; i++) {
        for (int j = 0; j <= i; j++) {
            scanf("%d", &triangle[i][j]);
        }
    }

    int maxSum = maxPathSum(triangle, N);
    printf("%d\n", maxSum);

    return 0;
}

该代码使用动态规划的思想来解决问题。定义一个dp数组,其中dp[i][j]表示从三角形顶部到达位置(i, j)的最佳路径的数字之和。

通过迭代计算dp数组,同时返回dp[0][0]作为结果。

首先,将dp数组的最底层初始化为三角形最底层的值,即dp[N-1][i] = triangle[N-1][i]。

然后,从倒数第二层开始迭代计算dp数组。对于位置(i, j),dp[i][j]的值可以通过以下方式计算:

  • dp[i][j] = triangle[i][j] + max(dp[i+1][j], dp[i+1][j+1]),即当前位置的值加上下一层相邻位置的最佳路径的数字之和。

最后,返回dp[0][0]作为结果,即最佳路径的数字之和。

第2题:数字构造

火山宝打算造一个 n 位的十进制数字出来。
对于 1 到 n 中的每一个 i,火山宝可以从 xi,1, …, xi,ki 这 ki 个 0-9 的数字中选择一个作为 ai。
在选择结束后,a1a2…an 形成了一个 n 位的十进制数——这就是火山宝造出来的数。
你需要帮火山宝计算他能造出的数中,有多少个是 3 的倍数。
时间限制:1000
内存限制:65536
输入
第一行输入一个整数 n(1 ≤ n ≤ 18),表示数字的位数。 接下来 n 行,每行第一个整数 ki (1 ≤ ki ≤ 10),表示第 i 中候选的数字数量。接着是 ki 个两两不同的 0-9 范围内的数字 xi,1, …, xi,ki。 输入保证 0 不是第一位的可选项。
输出
你需要输出一行一个整数,表示火山宝能造出的数字中,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
样例输出
样例输出1:
9
样例输出2:
30000
提示
样例1能造出来的 3 的倍数有 51, 54,60,63,72,81,84,90, 93。

要解决这个问题,可以使用回溯法来生成所有可能的数字,并检查每个数字是否是3的倍数。

以下是使用C语言实现的代码:

#include <stdio.h>
#include <stdbool.h>

int count = 0;

bool isMultipleOfThree(int num) {
    return num % 3 == 0;
}

void generateNumbers(int digits, int candidates[][10], int currentDigit, int currentNumber) {
    if (currentDigit > digits) {
        if (isMultipleOfThree(currentNumber)) {
            count++;
        }
        return;
    }

    for (int i = 0; i < candidates[currentDigit][0]; i++) {
        generateNumbers(digits, candidates, currentDigit + 1, currentNumber * 10 + candidates[currentDigit][i + 1]);
    }
}

int main() {
    int n;
    scanf("%d", &n);

    int candidates[18][10];
    for (int i = 1; i <= n; i++) {
        scanf("%d", &candidates[i][0]);
        for (int j = 1; j <= candidates[i][0]; j++) {
            scanf("%d", &candidates[i][j]);
        }
    }

    generateNumbers(n, candidates, 1, 0);

    printf("%d\n", count);

    return 0;
}

该代码通过递归的方式生成所有可能的数字。对于每一位,根据候选数字的数量进行循环,并将当前位的数字与之前的数字构成一个新的数。

在递归的过程中,如果生成的数字位数超过了给定的位数,则检查该数字是否是3的倍数。如果是,计数器count加1。

最后,输出计数器count的值,即火山宝能造出的数字中3的倍数的数量。

第3题:奶牛散步

从一个无限大的矩阵的中心点出发,一步只能向右走、向上走或向左走。恰好走N步且不经过已走的点共有多少种走法?
输入
一个数字,代表N,N<=1000
输出
输出有多少方案数模12345

样例输入
2
样例输出
7

要解决这个问题,可以使用动态规划的方法来计算不同步数下的方案数。

以下是使用C语言实现的代码:

#include <stdio.h>

int countWalks(int N) {
    int dp[2][3] = {0}; // 使用滚动数组保存状态

    dp[1][1] = 1; // 初始位置

    for (int step = 1; step <= N; step++) {
        int curr = step % 2; // 当前行的索引
        int prev = (step - 1) % 2; // 上一行的索引

        dp[curr][0] = (dp[prev][1] + dp[prev][2]) % 12345; // 向右走
        dp[curr][1] = (dp[prev][0] + dp[prev][2]) % 12345; // 向上走
        dp[curr][2] = (dp[prev][0] + dp[prev][1] + dp[prev][2]) % 12345; // 向左走
    }

    return dp[N % 2][0] + dp[N % 2][1] + dp[N % 2][2];
}

int main() {
    int N;
    scanf("%d", &N);

    int numWalks = countWalks(N);
    printf("%d\n", numWalks);

    return 0;
}

该代码使用滚动数组来保存状态,使用dp[i][j]表示走i步到达位置j的方案数。

初始时,将dp[1][1]设置为1,表示初始位置。

然后,从第2步开始迭代计算dp数组。对于每一步,根据上一步的方案数计算当前步的方案数:

  • 向右走:dp[curr][0] = (dp[prev][1] + dp[prev][2]) % 12345

  • 向上走:dp[curr][1] = (dp[prev][0] + dp[prev][2]) % 12345

  • 向左走:dp[curr][2] = (dp[prev][0] + dp[prev][1] + dp[prev][2]) % 12345

最后,返回dp[N % 2][0] + dp[N % 2][1] + dp[N % 2][2]作为结果,即走N步的方案数。

希望以上代码能帮助你解决问题!

第4题:吃奶酪

Jerry准备偷吃Tom的奶酪。所有的奶酪排成了一条直线,每块奶酪都有不同的美味程度。然而,如果有相邻两块奶酪都被Jerry偷吃,Tom就会发现这一点并迅速抓住Jerry。Jerry当然希望在不被Tom发现的条件下吃到的奶酪美味度总和最大。当然,他也可以选择一块奶酪都不吃。请你帮助他规划一下偷吃的方案,告诉他最多能偷吃到多少的美味度吧。
时间限制:1000
内存限制:65536
输入
第一行一个整数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

要解决这个问题,可以使用动态规划的方法来计算最大美味度总和。

以下是使用C语言实现的代码:

#include <stdio.h>

int max(int a, int b) {
    return (a > b) ? a : b;
}

long long int maxCheese(int n, int cheese[]) {
    long long int dp[100001] = {0};

    dp[0] = cheese[0];
    dp[1] = max(cheese[0], cheese[1]);

    for (int i = 2; i < n; i++) {
        dp[i] = max(dp[i - 1], dp[i - 2] + cheese[i]);
    }

    return dp[n - 1];
}

int main() {
    int T;
    scanf("%d", &T);

    while (T--) {
        int n;
        scanf("%d", &n);

        int cheese[100000];
        for (int i = 0; i < n; i++) {
            scanf("%d", &cheese[i]);
        }

        long long int maxSum = maxCheese(n, cheese);
        printf("%lld\n", maxSum);
    }

    return 0;
}

该代码使用动态规划来计算最大美味度总和。使用dp数组保存到达每个奶酪位置时的最大美味度总和。

初始时,dp[0]等于第一块奶酪的美味度,dp[1]等于第一块和第二块奶酪中较大的美味度。

然后,从第三块奶酪开始迭代计算dp数组。对于每个位置i,可以选择不偷第i块奶酪(保持dp[i-1]不变)或偷第i块奶酪(dp[i] = dp[i-2] + cheese[i])中较大的美味度总和。

最后,返回dp[n-1]作为结果,即Jerry可以吃到的最大美味度总和。

希望以上代码能帮助你解决问题!

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

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

相关文章

【力扣每日一题】2023.8.24 统计参与通信的服务器

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目顾名思义&#xff0c;要我们统计参与通信的服务器&#xff0c;给我们一个二维矩阵&#xff0c;元素为1的位置则表示是一台服务器。 …

特殊的矩阵与特殊的矩阵关系———实对称、正定、对角、零矩阵

一、特殊的矩阵 1、实对称矩阵 定义&#xff1a;都是实数&#xff0c;且 性质&#xff1a; &#xff08;1&#xff09;可以用特征值来求A的大小 &#xff08;2&#xff09;可以得到A的秩 &#xff08;3&#xff09;必定可以相似对角化 运用&#xff1a; 与实对称矩阵A合同的矩…

线性代数的学习和整理12: 矩阵与行列式,计算上的差别对比

目录 1 行列式和矩阵的比较 2 简单总结矩阵与行列式的不同 3 加减乘除的不同 3.1 加法不同 3.2 减法不同 3.3 标量乘法/数乘 3.3.1 标准的数乘对比 3.3.2 其他数乘对比 3.4 乘法 4 初等线性变换的不同 4.1 对矩阵进行线性变换 4.2 对行列式进行线性变换呢&#xf…

平衡二叉树的插入和删除(从现在开始摆脱旋转)

平衡二叉树是指任意节点的左子树和右子树高度之差的绝对值不超过1 一.插入操作 1.找到合适位置插入 2.从下到上&#xff0c;沿着插入节点与根节点的连线&#xff0c;找到不平衡的二叉树 以68为根节点的二叉树平衡&#xff0c;左右子树高度差为1 以60为根节点的二叉树不平衡&a…

【NX】NX中将点从一个坐标系映射到另一个坐标系

直接上代码吧&#xff0c;主要是使用了UF_CSYS_map_point函数&#xff1a; bool CAMToolPathToolkit::MapPointThroughRootWork(const AUTUMOONMathPoint3d &iPt, AUTUMOONMathPoint3d &oPt, int nTransMethod) {// 将点坐标转换为工作坐标系下坐标double arrPointInp…

有限与无限游戏 | 真北荐书

2023佛山敏捷之旅暨DevOps Meetup志愿者为进行大会的组织与准备&#xff0c;每周三晚有一个例会。 例会前等人的时间&#xff0c;涌现出一个小的分享环节。今天分享这本书&#xff1a;《有限与无限游戏》。 大家选择成为志愿者&#xff0c;是一个无限游戏。而组织活动和完成各种…

JavaSE 认识String类

目录 1 创建字符串2 字符串比较相等3 字符串常量池4 理解字符串不可变5 字符、字节与字符串5.1 字符与字符串5.2 字节与字符串5.3 小结 6 字符串常见操作6.1 字符串比较6.2 字符串查找6.3 字符串替换6.4 字符串拆分6.5 字符串截取6.6 其他操作方法 7 StringBuffer 和 StringBui…

AIGC ChatGPT 按年份进行动态选择的动态图表

动态可视化分析的好处与优势&#xff1a; 1. 提高信息理解性&#xff1a;可视化分析使得大量复杂的数据变得易于理解&#xff0c;通过图表、颜色、形状、尺寸等方式&#xff0c;能够直观地表现不同的数据关系和模式。 2. 加快决策速度&#xff1a;数据可视化可以帮助用户更快…

stm32 之20.HC-06蓝牙模块

原理图显示使用usart3串口使用的是PB10和PB11引脚 直接配置usart3串口协议 void usart3_init(uint32_t baud) {GPIO_InitTypeDef GPIO_InitStructureure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;//端口B硬件时钟打开RCC_AHB1PeriphClockC…

Qt中XML文件创建及解析

一 环境部署 QT的配置文件中添加xml选项&#xff1a; 二 写入xml文件 头文件&#xff1a;#include <QXmlStreamWriter> bool MyXML::writeToXMLFile() {QString currentTime QDateTime::currentDateTime().toString("yyyyMMddhhmmss");QString fileName &…

Codeforces Round 887 Div.3 A~D

文章目录 A. Blackboard ListB. Minimize Permutation SubarraysC. No Prime DifferencesD. Bracket Walk A. Blackboard List Problem - A - Codeforces 一个只有两个数的数组&#xff0c;选择数组中的任意两个数&#xff0c;计算它们差值的绝对值并加入数组 给定一个长度为…

计算机竞赛 基于人工智能的图像分类算法研究与实现 - 深度学习卷积神经网络图像分类

文章目录 0 简介1 常用的分类网络介绍1.1 CNN1.2 VGG1.3 GoogleNet 2 图像分类部分代码实现2.1 环境依赖2.2 需要导入的包2.3 参数设置(路径&#xff0c;图像尺寸&#xff0c;数据集分割比例)2.4 从preprocessedFolder读取图片并返回numpy格式(便于在神经网络中训练)2.5 数据预…

[JavaWeb]【十三】web后端开发-原理篇

目录 一、SpringBoot配置优先级 1.1 配置优先级比较 1.2 java系统属性和命令行参数 1.3 打包运行jar 1.4 综合优先级​编辑 二、Bean管理 2.1 获取bean 2.2 bean作用域 2.2.1 五种作用域 2.2.2 配置作用域 2.3 第三方bean 2.3.1 编写公共配置类 三、SpringBoot原理 …

二级MySQL(六)——表格数据插入

1、插入完整的数据记录&#xff1a; INSERT INTO tb_student VALUES(2014210103,王玲,女,1998-02-21,安徽,汉,CS1401); 结果&#xff1a; 2、插入指定位置的数据&#xff1a; 直接输入是错的&#xff1a; 需要指出插入的列名称&#xff1a; 结果&#xff1a; 中间两列允许输入…

cvc-complex-type.2.4.a: 发现了以元素 ‘base-extension‘ 开头的无效内容。应以 ‘{layoutlib}‘ 等等开头

不与世俗为伍。哪怕这是自己许给自己的诅咒。 —— 宫崎骏 《红猪》 最近&#xff0c;在使用最新版的AndroidStudio打开一个两年前的项目时候&#xff0c;报了一个如下的错误&#xff1a;【cvc-complex-type.2.4.a: 发现了以元素 ‘base-extension‘ 开头的无效内容】。应以 ‘…

基于PyTorch框架下网络模型的使用与修改

目录 1 损失函数和反向传播1.1 损失函数1.2 反向传播 2 优化器3 现有网络模型的使用及修改4 网络模型的保存与读取4.1 网络模型的保存4.2 网络模型的读取&#xff08;加载&#xff09; 5 完整的模型训练套路6 利用GPU训练模型7 完整的模型验证套路&#xff1a; 1 损失函数和反向…

基于DolphinScheduler的调度流程梳理及落地实践

目 录 01 背景‍ 02 主流调度引擎 ‍‍‍‍‍‍‍ 03 DolphinScheduler核心概念及调度过程‍‍‍‍‍‍ 04 开发实践 01‍ 背景‍‍ 随着数据中台概念及相关技术逐渐成熟、落地&#xff0c;不断有企业将其应用到自身业务中&#xff0c;将原本分散的各系统数据进行整合、分析…

【FAQ】安防监控视频汇聚平台EasyCVR接入GB国标设备,无法显示通道信息的排查方法

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

http协议与apache

http概念&#xff1a; 互联网&#xff1a;是网络的网络&#xff0c;是所有类型网络的母集 因特网&#xff1a;世界上最大的互联网网络。即因特网概念从属于互联网概念 万维网&#xff1a;万维网并非某种特殊的计算机网络&#xff0c;是一个大规模的、联机式的信息贮藏库&…

【前端从0开始】JavaSript——Date对象

创建Date对象 var dateObjnew Date(); 方法 将日期转为字符串 toLocaleString() toLocaleDateString() toLocaleTimeString()获取年、月、日、小时、分、秒 ○1&#xff09;getYear() //两位的年(2000年前)或三位的年[1900] 获取两位数的年&#xff0c;从1900年开始计算&…