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

news2025/3/3 4:10:18

在这里插入图片描述

C/C++编程(1~8级)全部真题・点这里
Python编程(1~6级)全部真题・点这里

第1题:酒鬼

Santo刚刚与房东打赌赢得了一间在New Clondike 的大客厅。今天,他来到这个大客厅欣赏他的奖品。房东摆出了一行瓶子在酒吧上。瓶子里都装有不同体积的酒。令Santo高兴的是,瓶子中的酒都有不同的味道。房东说道:“你可以喝尽可能多的酒,但是一旦打开酒盖你就必须把它喝完,喝完一瓶后把它放回原处。还有一件最重要的事,你必须从左至右依次喝,并且不能连续超过三瓶,不然会给你带来坏运气。”现在可怜的Santo站在酒吧前努力的想着,他到底应该喝哪几瓶才能使喝的酒最多呢?请帮助他找出他应该喝的酒瓶号,因为思考让他感到不安。
时间限制:2000
内存限制:131072
输入
第一行一个整数N,有N个酒瓶。N<=700接下有N行,第I+1行的数字代表酒瓶I中酒的体积。
输出
一个数字,喝的酒的最大总体积。遵守以上规则,使得三个连续瓶子中至少一个瓶子是满的。
样例输入
6
6
10
13
9
8
1
样例输出
33

这个问题可以使用动态规划来解决。我们可以定义一个数组dp,其中dp[i]表示从第1瓶到第i瓶中可以喝的最大总体积。然后,我们可以使用以下递推关系来计算dp[i]的值:

  • 如果只有一瓶酒(i = 1),则dp[i]等于该酒瓶的体积。

  • 如果有两瓶酒(i = 2),则dp[i]等于前两瓶酒瓶体积的最大值。

  • 如果有三瓶或更多的酒(i >= 3),则有两种情况:

    • 情况一:喝第i瓶酒,那么前两瓶酒中至少有一瓶是满的。此时,dp[i]等于第i瓶酒的体积加上dp[i-2]

    • 情况二:不喝第i瓶酒,那么前两瓶酒中至少有两瓶是满的。此时,dp[i]等于dp[i-1]

最后,我们返回dp[N]作为喝的酒的最大总体积。以下是使用C语言编写的解决方案:

#include <stdio.h>

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

int maxDrinkingVolume(int volumes[], int N) {
    int dp[702];  // dp数组,从0开始
    dp[0] = 0;    // 初始化dp[0]
    dp[1] = volumes[0];  // 只有一瓶酒

    if (N >= 2) {
        dp[2] = max(volumes[0], volumes[1]);  // 有两瓶酒
    }

    for (int i = 3; i <= N; i++) {
        dp[i] = max(volumes[i-1] + dp[i-2], dp[i-1]);  // 递推关系
    }

    return dp[N];
}

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

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

    int result = maxDrinkingVolume(volumes, N);
    printf("%d\n", result);

    return 0;
}

程序首先使用scanf函数从标准输入读取酒瓶的数量N。

然后,使用一个循环从标准输入读取每个酒瓶的体积,并将它们存储在一个名为volumes的数组中。

调用maxDrinkingVolume函数,传递酒瓶体积数组和酒瓶数量作为参数,计算最大的喝酒总体积。

maxDrinkingVolume函数中,定义一个名为dp的数组,用于存储动态规划的结果。

根据递推关系,使用一个循环从3到N,计算dp[i]的值。

最后,返回dp[N]作为喝的酒的最大总体积。

在主函数中,使用printf函数输出计算得到的结果。

例如,如果输入为6,表示有6个酒瓶,然后依次输入6个酒瓶的体积。

程序将计算喝的酒的最大总体积,并输出。

根据给定的数据,喝的酒的最大总体积为33,输出"33"。

第2题:大盗

阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。
这条街上一共有 N 家店铺,每家店中都有一些现金。阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时,街上的报警系统才会启动,然后警察就会蜂拥而至。
作为一向谨慎作案的大盗,阿福不愿意冒着被警察追捕的风险行窃。他想知道,在不惊动警察的情况下,他今晚最多可以得到多少现金?
时间限制:1000
内存限制:65536
输入
输入的第一行是一个整数 T (T <= 50) ,表示一共有 T 组数据。 接下来的每组数据,第一行是一个整数 N (1 <= N <= 100, 000) ,表示一共有 N 家店铺。第二行是 N 个被空格分开的正整数,表示每一家店铺中的现金数量。每家店铺中的现金数量均不超过 1000 。
输出
对于每组数据,输出一行。该行包含一个整数,表示阿福在不惊动警察的情况下可以得到的现金数量。
样例输入
2
3
1 8 2
4
10 7 6 14
样例输出
8
24
提示
对于第一组样例,阿福选择第 2 家店铺行窃,获得的现金数量为 8 。 对于第二组样例,阿福选择第 1 和 4 家店铺行窃,获得的现金数量为 10 + 14 = 24 。

以下是使用C语言编写的解决方案:

#include <stdio.h>

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

int maxCash(int cash[], int N) {
    int dp[100002];  // dp数组,从0开始
    dp[0] = 0;    // 初始化dp[0]
    dp[1] = cash[0];  // 只有一家店铺

    if (N >= 2) {
        dp[2] = max(cash[0], cash[1]);  // 有两家店铺
    }

    for (int i = 3; i <= N; i++) {
        dp[i] = max(cash[i-1] + dp[i-2], dp[i-1]);  // 递推关系
    }

    return dp[N];
}

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

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

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

        int result = maxCash(cash, N);
        printf("%d\n", result);
    }

    return 0;
}

程序首先使用scanf函数从标准输入读取数据组数T。

然后,使用一个循环对每组数据进行处理。

在每次循环中,使用scanf函数从标准输入读取店铺数量N。

然后,使用一个循环从标准输入读取每家店铺的现金数量,并将它们存储在一个名为cash的数组中。

调用maxCash函数,传递现金数量数组和店铺数量作为参数,计算阿福可以得到的最大现金数量。

maxCash函数中,定义一个名为dp的数组,用于存储动态规划的结果。

根据递推关系,使用一个循环从3到N,计算dp[i]的值。

最后,返回dp[N]作为阿福可以得到的最大现金数量。

在主函数中,使用printf函数输出计算得到的结果。

例如,如果输入为2,表示有2组数据,然后依次输入每组数据的店铺数量和每家店铺的现金数量。

程序将计算阿福可以得到的最大现金数量,并输出。

根据给定的数据,第一组数据中阿福可以得到的最大现金数量为8,输出"8"。第二组数据中阿福可以得到的最大现金数量为24,输出"24"。

第3题:核电站

一个核电站有N个放核物质的坑,坑排列在一条直线上。如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质。
任务:对于给定的N和M,求不发生爆炸的放置核物质的方案总数
时间限制:6000
内存限制:131072
输入
只一行,两个正整数N,M( 1 < N < 50,2 ≤ M ≤ 5 )
输出
一个正整数S,表示方案总数。
样例输入
4 3
样例输出
13

以下是使用C语言编写的解决方案:

#include <stdio.h>

long long int countArrangements(int N, int M) {
    long long int dp[51][6] = {0};  // dp数组,从0开始
    dp[0][0] = 1;  // 初始化dp[0][0]

    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= M; j++) {
            for (int k = 0; k <= i - j; k++) {
                dp[i][j] += dp[k][j - 1];  // 递推关系
            }
        }
    }

    long long int sum = 0;
    for (int j = 0; j <= M; j++) {
        sum += dp[N][j];  // 将所有dp[N][j]的值相加
    }

    return sum;
}

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

    long long int result = countArrangements(N, M);
    printf("%lld\n", result);

    return 0;
}

程序首先使用scanf函数从标准输入读取核电站的坑数量N和连续放置核物质的坑数量M。

调用countArrangements函数,传递坑数量N和连续放置核物质的坑数量M作为参数,计算不发生爆炸的放置核物质的方案总数。

countArrangements函数中,定义一个名为dp的二维数组,用于存储动态规划的结果。

根据递推关系,使用三个嵌套循环,依次计算dp[i][j]的值。

最后,将所有dp[N][j]的值相加,得到方案总数。

在主函数中,使用printf函数输出计算得到的结果。

例如,如果输入为4 3,表示核电站有4个坑,连续放置核物质的坑数量为3。

程序将计算不发生爆炸的放置核物质的方案总数,并输出。

根据给定的数据,不发生爆炸的放置核物质的方案总数为13,输出"13"。

第4题:盒子与小球之二

N个有差别的盒子(1<=N<=20)。你有A个红球和B个蓝球。0 <= A <= 15, 0 <= B <= 15。球除了颜色没有任何区别。你可以将球放进盒子。一个盒子可以同时放进两种球,也可以只放一种,也可以空着。球不必全部放入盒子中。编程计算有多少种放置球的方法。
时间限制:10000
内存限制:131072
输入
就一行,N,A,B,用空格分开
输出
就一行,输出放置方案总数
样例输入
2 1 1
样例输出
9

以下是使用C语言编写的解决方案:

#include <stdio.h>

int countArrangements(int N, int A, int B) {
    int dp[21][16][16] = {0};  // dp数组,从0开始
    dp[0][0][0] = 1;  // 初始化dp[0][0][0]

    for (int i = 1; i <= N; i++) {
        for (int j = 0; j <= A; j++) {
            for (int k = 0; k <= B; k++) {
                for (int x = 0; x <= j; x++) {
                    for (int y = 0; y <= k; y++) {
                        dp[i][j][k] += dp[i - 1][j - x][k - y];  // 递推关系
                    }
                }
            }
        }
    }

    int sum = 0;
    for (int j = 0; j <= A; j++) {
        for (int k = 0; k <= B; k++) {
            sum += dp[N][j][k];  // 将所有dp[N][j][k]的值相加
        }
    }

    return sum;
}

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

    int result = countArrangements(N, A, B);
    printf("%d\n", result);

    return 0;
}

程序首先使用scanf函数从标准输入读取盒子数量N、红球数量A和蓝球数量B。

调用countArrangements函数,传递盒子数量N、红球数量A和蓝球数量B作为参数,计算放置球的方法总数。

countArrangements函数中,定义一个名为dp的三维数组,用于存储动态规划的结果。

根据递推关系,使用五个嵌套循环,依次计算dp[i][j][k]的值。

最后,将所有dp[N][j][k]的值相加,得到放置球的方法总数。

在主函数中,使用printf函数输出计算得到的结果。

例如,如果输入为2 1 1,表示有2个盒子,1个红球和1个蓝球。

程序将计算放置球的方法总数,并输出。

根据给定的数据,放置球的方法总数为9,输出"9"。

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

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

相关文章

《向量数据库指南》——向量数据库与 ANN 算法库的区别

向量数据库与 ANN 算法库的区别 我们经常听到一个这样的错误观念——向量数据库只是在 ANN(approximate nearest neighbor,近似最近邻)算法上封装了一层。但这种说法大错特错。 向量数据库可以处理大规模数据,而 ANN 算法库只能处理小型的数据集 从本质上来看,以 Milvus 为…

Adobe Premiere Pro 和 After Effects 安装出错的解决路径

在有点年头的电脑上安装Premiere Pro 和 After Effects 遇到了前所未有的的麻烦&#xff0c;请了某宝上的小哥进行远程安装&#xff0c;两个软件倒是可以用了&#xff0c;但Win11系统无法正常关机&#xff0c;用了几天系统除了关机时会蓝屏几十秒&#xff0c;其他没有发现毛病&…

centos 7 lamp owncloud

OwnCloud是一款开源的云存储软件&#xff0c;基于PHP的自建网盘。基本上是私人使用&#xff0c;没有用户注册功能&#xff0c;但是有用户添加功能&#xff0c;你可以无限制地添加用户&#xff0c;OwnCloud支持多个平台&#xff08;windows&#xff0c;MAC&#xff0c;Android&a…

计算机网络 | 物理层

计算机网络 | 物理层 计算机网络 | 物理层基本概念数据通信基本知识&#xff08;一&#xff09;一个数据通信流程的例子数据通信相关术语三种通信方式数据传输方式串行传输和并行传输同步传输和异步传输 小结 数据通信基本知识&#xff08;二&#xff09;码元&#xff08;Symbo…

【Java 进阶篇】JavaScript 一元运算符详解

在JavaScript中&#xff0c;一元运算符是一类操作符&#xff0c;它们作用于单一操作数&#xff08;一个值&#xff09;。这些运算符执行各种操作&#xff0c;包括递增、递减、类型转换等。本文将详细介绍JavaScript中的一元运算符&#xff0c;解释它们的用途&#xff0c;提供示…

MySQL MVCC详细介绍

MVCC概念 MVCC(Multi-Version Concurrency Control) 多版本并发控制&#xff0c;是一种并发控制机制,用于处理数据库中的并发读写操作&#xff0c;它通过在每个事务中创建数据的快照&#xff0c;实现了读写操作的隔离性&#xff0c;从而避免了读写冲突和数据不一致的问题。 M…

VUE echarts 柱状图、折线图 双Y轴 显示

weekData: [“1周”,“2周”,“3周”,“4周”,“5周”,“6周”,“7周”,“8周”,“9周”,“10周”], //柱状图横轴 jdslData: [150, 220, 430, 360, 450, 680, 100, 450, 680, 200], // 折线图的数据 cyslData: [100, 200, 400, 300, 500, 500, 500, 450, 480, 400], // 柱状图…

基于VScode 使用plantUML 插件设计状态机

本文主要记录本人初次在VScode上使用PlantUML设计 本文只讲述操作的实际方法&#xff0c;假设java已安装成功 。 1. 在VScode下安装如下插件 2. 验证环境是否正常 新建一个文件夹并在目录下面新建文件test.plantuml 其内容如下所示: startuml hello world skinparam Style …

ubuntu|23 安装Gnome主题

ubuntu23 安装主题 进入网站选择需要的主题 https://www.opendesktop.org/s/Gnome/p/1357889 1 资源下载 经常加载不出来&#xff0c; 这里直接进入github下载源码 下载zip 2 安装主题 根据文档提示&#xff0c; 执行install.sh就能安装 3 切换主题 安装 tweak工具 sudo …

Win10玩游戏老是弹回桌面的解决方法

在Win10电脑中&#xff0c;用户不仅可以办公&#xff0c;也可以畅玩各种各样的游戏。但是&#xff0c;有时候用户在玩游戏的时候&#xff0c;遇到了游戏老是自己弹回桌面的问题&#xff0c;这样是非常影响游戏体验的&#xff0c;却不清楚具体的解决方法。下面小编给大家带来了简…

力扣第235题 二又搜索树的最近公共祖先 c++

题目 235. 二叉搜索树的最近公共祖先 中等 &#xff08;简单&#xff09; 相关标签 树 深度优先搜索 二叉搜索树 二叉树 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&…

抖音短视频SEO是什么?抖音SEO系统源码/SEO系统源码搭建/

一.数据市场 二、AI视频创意 (1)工作台 (2)创造性工程 (3)材料管理 (4)裂变视频 (5)创作灵感 场景:实现单体设计模式&#xff1b; 想法:与创建相关的是construct的陷阱&#xff0c;每次我们都返回相同的实例。 (1)推广词库(2)三维排名查询(3)算术指数四。帐户矩阵操作(1)账户管…

谷歌浏览器 ERR_MANDATORY_PROXY_CONFIGURATION_FAILED 报错的处理方式

今天早上到公司 还是和往常一样 电脑开机 打开谷歌浏览器 搜索资料结果给我报错了 2.原先我的谷歌浏览器配置的搜索引擎为百度 3.电脑上面的火狐 ie浏览器都是可以的排除电脑网络方面的问题(dns也有解析谷歌路径的这个有兴趣的可以研究) 最终还是刷新了电脑的dns ,清除了谷歌…

混淆技术研究笔记(六)如何基于yGuard实现?

确定参考 <adjust> 作为入口后&#xff0c;就需要详细了解这部分代码的逻辑。 需要看yguard源码了&#xff0c;你会如何阅读一个完全不了解的源码&#xff1f; 我通常的策略都是找一个目标&#xff0c;添加代码依赖&#xff0c;写好demo&#xff0c;debug跟踪代码看。如…

大功率回馈式直流电子负载箱的运用

大功率回馈式直流电子负载箱能够模拟各种负载条件&#xff0c;可以在实验室环境中对电源、电池、太阳能电池板等电子设备进行全面的性能测试和模拟负载&#xff0c;具有高功率输出、高精度、高稳定性和高可靠性的特点&#xff0c;能够满足各种应用场景的需求。 电源测试方面大功…

深入了解桶排序:原理、性能分析与 Java 实现

桶排序&#xff08;Bucket Sort&#xff09;是一种排序算法&#xff0c;通常用于将一组数据分割成有限数量的桶&#xff08;或容器&#xff09;&#xff0c;然后对每个桶中的数据进行排序&#xff0c;最后将这些桶按顺序合并以得到排好序的数据集。 桶排序原理 确定桶的数量&am…

eclipse 某个文件不能编辑

今天打开eclipse 突然发现有一个文件不能编辑&#xff0c;左下角发现此文件被修改为只读&#xff0c; 右键此文件-->properties--> Resource -->在Attributes中&#xff0c;取消Read-only选项--> Apply 此时&#xff0c;发现eclipse 右下角 变为Writable。再次编辑…

windows查看登陆的IP

我的电脑右键打开管理 筛选当前日志 4648 可以查看到IP了

象棋小游戏【小游戏】(Java课设)

系统类型 Java实现的小游戏 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Idea或eclipse 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/88388732 更多Java课设系统源码地址&#xff1a;更多J…

Android---java线程优化 偏向锁、轻量级锁和重量级锁

java 中的线程是映射到操作系统原生线程之上的&#xff0c;如果要阻塞或唤醒一个线程就需要操作系统的帮忙&#xff0c;这就需要从用户态转换到核心态。状态转换需要花费很多时间&#xff0c;如下代码所示&#xff1a; private Object lock new Object();private int value;p…