电子学会C/C++编程等级考试2023年05月(四级)真题解析

news2024/11/15 4:39:37

在这里插入图片描述

C/C++等级考试(1~8级)全部真题・点这里

第1题:怪盗基德的滑翔翼

怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯。而他最为突出的地方,就是他每次都能逃脱中村警部的重重围堵,而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。
有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却被柯南小朋友识破了伪装,而他的滑翔翼的动力装置也被柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的滑翔翼逃脱。
假设城市中一共有N幢建筑排成一条线,每幢建筑的高度各不相同。初始时,怪盗基德可以在任何一幢建筑的顶端。他可以选择一个方向逃跑,但是不能中途改变方向(因为中森警部会在后面追击)。因为滑翔翼动力装置受损,他只能往下滑行(即:只能从较高的建筑滑翔到较低的建筑)。他希望尽可能多地经过不同建筑的顶部,这样可以减缓下降时的冲击力,减少受伤的可能性。请问,他最多可以经过多少幢不同建筑的顶部(包含初始时的建筑)?
输入
输入数据第一行是一个整数K(K < 100),代表有K组测试数据。 每组测试数据包含两行:第一行是一个整数N(N < 100),代表有N幢建筑。第二行包含N个不同的整数,每一个对应一幢建筑的高度h(0 < h < 10000),按照建筑的排列顺序给出。
输出
对于每一组测试数据,输出一行,包含一个整数,代表怪盗基德最多可以经过的建筑数量。
样例输入
3
8
300 207 155 299 298 170 158 65
8
65 158 170 298 299 155 207 300
10
2 1 3 4 5 6 7 8 9 10
样例输出
6
6
9

以下是一个解决这个问题的C++程序示例:

#include <iostream>
#include <vector>
using namespace std;

int getMaxBuildings(vector<int>& heights) {
    int maxBuildings = 1;
    int maxHeight = heights[0];
    
    for (int i = 1; i < heights.size(); i++) {
        if (heights[i] > maxHeight) {
            maxBuildings++;
            maxHeight = heights[i];
        }
    }
    
    return maxBuildings;
}

int main() {
    int k;
    cin >> k;
    
    for (int i = 0; i < k; i++) {
        int n;
        cin >> n;
        
        vector<int> heights(n);
        for (int j = 0; j < n; j++) {
            cin >> heights[j];
        }
        
        int maxBuildings = getMaxBuildings(heights);
        cout << maxBuildings << endl;
    }
    
    return 0;
}

该程序使用一个循环来处理每组测试数据。对于每组测试数据,首先读取建筑数量n,然后读取n个不同的整数,表示每幢建筑的高度。接下来,使用一个循环遍历建筑高度,并通过比较当前建筑高度与之前最高建筑的高度来确定是否可以经过该建筑。如果当前建筑高度大于之前最高建筑的高度,那么可以经过该建筑,并将最大建筑数量加1,并更新最高建筑的高度。最后,输出最大建筑数量作为结果。程序根据输入的测试数据组数k,循环读取每组测试数据,并输出对应的结果。

第2题:数字组合

有n个正整数,找出其中和为t(t也是正整数)的可能的组合方式。如: n=5,5个数分别为1,2,3,4,5,t=5; 那么可能的组合有5=1+4和5=2+3和5=5三种组合方式。
输入
输入的第一行是两个正整数n和t,用空格隔开,其中1<=n<=20,表示正整数的个数,t为要求的和(1<=t<=1000) 接下来的一行是n个正整数,用空格隔开。
输出
和为t的不同的组合方式的数目。
样例输入
5 5
1 2 3 4 5
样例输出
3

以下是一个解决这个问题的C++程序示例:

#include <iostream>
#include <vector>
using namespace std;

int countCombinations(vector<int>& nums, int target) {
    int n = nums.size();
    vector<vector<int>> dp(n + 1, vector<int>(target + 1, 0));
    
    // 初始化第一列,表示和为0的组合数为1
    for (int i = 0; i <= n; i++) {
        dp[i][0] = 1;
    }
    
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= target; j++) {
            // 如果当前数字大于目标和,则不能选择该数字
            if (nums[i - 1] > j) {
                dp[i][j] = dp[i - 1][j];
            } else {
                // 选择当前数字和不选择当前数字两种情况的组合数之和
                dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i - 1]];
            }
        }
    }
    
    return dp[n][target];
}

int main() {
    int n, t;
    cin >> n >> t;
    
    vector<int> nums(n);
    for (int i = 0; i < n; i++) {
        cin >> nums[i];
    }
    
    int result = countCombinations(nums, t);
    cout << result << endl;
    
    return 0;
}

该程序使用动态规划的方法来解决问题。首先,创建一个二维数组dp,其中dp[i][j]表示使用前i个数字组成和为j的组合数。然后,初始化第一列,表示和为0的组合数为1。接下来,使用两个嵌套循环遍历数组和目标和,根据当前数字的大小来确定选择该数字和不选择该数字两种情况下的组合数。最后,返回dp[n][target]作为结果。程序根据输入的正整数个数n和目标和t,读取n个正整数,并调用countCombinations函数计算结果,然后输出结果。

第3题:带通配符的字符串匹配

通配符是一类键盘字符,当我们不知道真正字符或者不想键入完整名字时,常常使用通配符代替一个或多个真正字符。通配符有问号(?)和星号(*)等,其中,“?”可以代替一个字符,而“*”可以代替零个或多个字符。
你的任务是,给出一个带有通配符的字符串和一个不带通配符的字符串,判断他们是否能够匹配。
例如,1?456 可以匹配 12456、13456、1a456,但是却不能够匹配23456、1aa456;2*77?8可以匹配 24457798、237708、27798。
输入
输入有两行,每行为一个不超过20个字符的字符串,第一行带通配符,第二行不带通配符
输出
如果两者可以匹配,就输出“matched”,否则输出“not matched”
样例输入
1*456?
11111114567
样例输出
matched

以下是一个解决这个问题的C++程序示例:

#include <iostream>
#include <string>
using namespace std;

bool isMatched(string pattern, string text) {
    int m = pattern.length();
    int n = text.length();
    
    // 创建一个二维数组dp,dp[i][j]表示pattern的前i个字符和text的前j个字符是否匹配
    vector<vector<bool>> dp(m + 1, vector<bool>(n + 1, false));
    
    // 初始化dp[0][0]为true,表示空字符串匹配
    dp[0][0] = true;
    
    // 处理pattern以*开头的情况
    for (int i = 1; i <= m; i++) {
        if (pattern[i - 1] == '*') {
            dp[i][0] = dp[i - 1][0];
        }
    }
    
    // 动态规划计算匹配情况
    for (int i = 1; i <= m; i++) {
        for (int j = 1; j <= n; j++) {
            if (pattern[i - 1] == '?' || pattern[i - 1] == text[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1];
            } else if (pattern[i - 1] == '*') {
                dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
            }
        }
    }
    
    return dp[m][n];
}

int main() {
    string pattern, text;
    cin >> pattern >> text;
    
    bool matched = isMatched(pattern, text);
    if (matched) {
        cout << "matched" << endl;
    } else {
        cout << "not matched" << endl;
    }
    
    return 0;
}

该程序使用动态规划的方法来解决问题。首先,创建一个二维数组dp,其中dp[i][j]表示pattern的前i个字符和text的前j个字符是否匹配。然后,初始化dp[0][0]为true,表示空字符串匹配。接下来,处理pattern以开头的情况,如果pattern的第一个字符是,则将dp[i][0]设置为dp[i-1][0]。然后,使用两个嵌套循环遍历pattern和text的字符,根据当前字符的情况来确定匹配情况。如果当前字符是?或者与text的当前字符相等,则将dp[i][j]设置为dp[i-1][j-1]。如果当前字符是*,则将dp[i][j]设置为dp[i-1][j]或者dp[i][j-1]的逻辑或。最后,返回dp[m][n]作为结果。程序根据输入的带通配符的字符串和不带通配符的字符串,调用isMatched函数判断是否匹配,并输出结果。

第4题:股票买卖

最近越来越多的人都投身股市,阿福也有点心动了。谨记着“股市有风险,入市需谨慎”,阿福决定先来研究一下简化版的股票买卖问题。
假设阿福已经准确预测出了某只股票在未来 N 天的价格,他希望买卖两次,使得获得的利润最高。为了计算简单起见,利润的计算方式为卖出的价格减去买入的价格。
同一天可以进行多次买卖。但是在第一次买入之后,必须要先卖出,然后才可以第二次买入。
现在,阿福想知道他最多可以获得多少利润。
输入
输入的第一行是一个整数 T (T <= 50) ,表示一共有 T 组数据。 接下来的每组数据,第一行是一个整数 N (1 <= N <= 100, 000) ,表示一共有 N 天。第二行是 N 个被空格分开的整数,表示每天该股票的价格。该股票每天的价格的绝对值均不会超过 1,000,000 。
输出
对于每组数据,输出一行。该行包含一个整数,表示阿福能够获得的最大的利润。
样例输入
3
7
5 14 -2 4 9 3 17
6
6 8 7 4 1 -2
4
18 9 5 2
样例输出
28
2
0
提示:对于第一组样例,阿福可以第 1 次在第 1 天买入(价格为 5 ),然后在第 2 天卖出(价格为 14 )。第 2 次在第 3 天买入(价格为 -2 ),然后在第 7 天卖出(价格为 17 )。一共获得的利润是 (14 - 5) + (17 - (-2)) = 28 对于第二组样例,阿福可以第 1 次在第 1 天买入(价格为 6 ),然后在第 2 天卖出(价格为 8 )。第 2 次仍然在第 2 天买入,然后在第 2 天卖出。一共获得的利润是 8 - 6 = 2 对于第三组样例,由于价格一直在下跌阿福可以随便选择一天买入之后迅速卖出。获得的最大利润为 0

下面是一个C++的实现示例:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int maxProfit(vector<int>& prices) {
    int n = prices.size();
    if (n <= 1) {
        return 0;
    }
    
    vector<int> buy(n, 0);
    vector<int> sell(n, 0);
    
    buy[0] = -prices[0];
    sell[0] = 0;
    
    for (int i = 1; i < n; i++) {
        buy[i] = max(buy[i-1], -prices[i]);
        sell[i] = max(sell[i-1], buy[i-1] + prices[i]);
    }
    
    return sell[n-1];
}

int main() {
    int T;
    cin >> T;
    
    while (T--) {
        int N;
        cin >> N;
        
        vector<int> prices(N);
        for (int i = 0; i < N; i++) {
            cin >> prices[i];
        }
        
        int max_profit = maxProfit(prices);
        cout << max_profit << endl;
    }
    
    return 0;
}

这是一个动态规划问题。我们可以使用两个数组来记录买入和卖出的最大利润。假设buy[i]表示在第i天之前进行一次买入操作所能获得的最大利润,sell[i]表示在第i天之前进行一次卖出操作所能获得的最大利润。

对于buy[i],我们可以选择在第i天买入股票,或者不进行任何操作。如果选择在第i天买入股票,那么buy[i] = max(buy[i-1], -prices[i]),即前一天的买入利润和在第i天买入的利润的较大值。如果选择不进行任何操作,那么buy[i] = buy[i-1]。

对于sell[i],我们可以选择在第i天卖出股票,或者不进行任何操作。如果选择在第i天卖出股票,那么sell[i] = max(sell[i-1], buy[i-1] + prices[i]),即前一天的卖出利润和在第i天卖出的利润的较大值。如果选择不进行任何操作,那么sell[i] = sell[i-1]。

最后,我们的目标是求得最大利润,即max(sell[N-1]),其中N为天数。

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

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

相关文章

云原生安全:如何保护云上应用不受攻击

文章目录 云原生安全的概念1. 多层次的安全性2. 自动化安全3. 容器安全4. 持续监控5. 合规性 云原生安全的关键挑战1. 无边界的环境2. 动态性3. 多云环境4. 容器化应用程序5. API和微服务 如何保护云上应用不受攻击1. 身份验证和访问控制示例代码&#xff1a; 2. 数据加密示例代…

Python时间序列分析库介绍:statsmodels、tslearn、tssearch、tsfresh

时间序列分析在金融和医疗保健等领域至关重要&#xff0c;在这些领域&#xff0c;理解随时间变化的数据模式至关重要。在本文中&#xff0c;我们将介绍四个主要的Python库——statmodels、tslearn、tssearch和tsfresh——每个库都针对时间序列分析的不同方面进行了定制。这些库…

深入浅出排序算法之计数排序

目录 1. 原理 2. 代码实现 3. 性能分析 1. 原理 首先看一个题目&#xff0c;有n个数&#xff0c;取值范围是 0~n&#xff0c;写出一个排序算法&#xff0c;要求时间复杂度和空间复杂度都是O(n)的。 为了达到这种效果&#xff0c;这一篇将会介绍一种不基于比较的排序方法。这…

Day 11 python学习笔记

模块 内置模块 random random&#xff1a;随机数模块 我们可以在解释器中看到其蕴含的方法 接下来我解释一些常用的方法&#xff1a; random.random( ) random.random( ) 返回0-1的随机数 [0,1) >>> random.random() 0.364183511476754 random.randint(n,m) r…

Java JSON字符串转换成JSON对象

方法一&#xff1a;要先转为LinkedHashMap&#xff0c;再转json&#xff08;推荐&#xff0c;我使用这种方法&#xff09; String jsonStr"{\"id\":\"10001\",\"name\":\"肉类\",\"menus\":[{\"name\":\&qu…

Node切换版本

以非安转版本方式安装Node&#xff0c;经常会需要进行Node的版本切换。 官方的做法是&#xff1a;nvm use version。 但是这种方法经常会失败。如下&#xff1a; 其实nvm命令的本质就是给当前node版本添加一个快捷方式&#xff08;或软连接&#xff09;&#xff0c;因为环境变…

AT800(3000) +昇腾300V 之一 环境部署

环境部署 背景服务器 硬件资源系统&#xff1a;CPU&#xff1a;NPU&#xff1a;固件与驱动CANN 背景 因nvidia 受限 公司转华为推理服务器 AT800&#xff08;3000&#xff09; 昇腾 &#xff0c;将推出一系列文章 &#xff0c;记录过程。 服务器 硬件资源 系统&#xff1a;…

再畅通工程(最小生成树)

题目描述&#xff1a;还是畅通工程 某省调查乡村交通状况&#xff0c;得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通&#xff08;但不一定有直接的公路相连&#xff0c;只要能间接通过公路可达即可&#xff09;&…

轻量封装WebGPU渲染系统示例<6>-混合模式(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/version-1.01/src/voxgpu/sample/BlendTest.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据和渲染机制分离。 5. 用户…

8086汇编环境的使用

先打开emu8086&#xff0c;写入代码 ;给11003H的地址赋1234H的值;不能直接给DS赋值需要寄存器中转 mov dx, 1100H mov ds, dx mov ax, 1234H ;不能直接给内存地址赋值&#xff0c;需要DS:[偏移地址]指向内存 mov [3H], ax 点击emulate开始模拟 出现调试框&#xff0c;调试框的…

moviepy处理手机端图片旋转问题

1.手机拍摄的图片或者在ffmpeg处理的时候&#xff0c;会读取图片的元数据从而进行旋转 左边是拍摄的图片&#xff0c;右侧是进行处理以后得图片 video VideoFileClip(file_path) if video.rotation in (90, 270):video video.resize(video.size[::-1])video.rotation 0

Live800:智能客服的意义和价值

近年来&#xff0c;智能客服系统的出现引起了各行各业的共同关注&#xff0c;成为了许多企业在数字化转型中的重要步骤之一。智能客服系统能够帮助企业降低人力成本&#xff0c;提高客户满意度&#xff0c;对于企业而言具有不可替代的价值和意义。 智能客服系统的主要价值包括以…

Diffusion Models视频生成-博客汇总

0、【论文汇总】Diffusion Models视频生成/视频编辑/可控视频生成/跨模态视频生成 本文总结了Diffusion Models视频生成领域相关的工作,目前共收录142篇,持续更新中。 1、Video Diffusion Models:基于扩散模型的视频生成 扩散模型已经被广泛运用到图像生成、image-to-image转…

网络搭建和运维的基础题目

服务部分&#xff08;linux&#xff09; 实操部分 1.在任意文件夹下面创建形如 A/B/C/D 格式的文件夹系列。 [rootlocalhost ~]# mkdir -p A/B/C/D 2.在创建好的文件夹下面&#xff0c;A/B/C/D &#xff0c;里面创建文本文件 mkdir.txt [rootlocalhost ~]# cd A/B/C/D [r…

前端跨页面通信,你知道哪些方法?

一、同源页面 1.广播站模式 一个页面将消息通知给一个“中央站”&#xff0c;再由“中央站”通知给各个页面&#xff0c;以下会介绍这个中央站可以是LocalStorage&#xff0c;可以是BroadCast Channel实例&#xff0c;也可以是一个Service worker 1.1.LocalStorageStorageEven…

[AUTOSAR][诊断管理][ECU][$27] 安全访问

文章目录 一、简介$27服务有何作用,为什么要有27服务呢?功能描述应用场景安全解锁基本原理服务请求服务响应Verify Key负响应NRC支持二、常见Bug大揭秘三、示例代码uds27_security_access.c一、简介 $27服务有何作用,为什么要有27服务呢? 功能描述 根据ISO14119-1标准中…

网络基础-3

路由开销 一条路由的开销时指到达这条路由的目的地/掩码需要付出的带价值。同一种路由协议发现有多条路由可以到达同一目的地/掩码时&#xff0c;将优选开销最小的路由&#xff0c;即只把开销最小的路由加入进本协议的路由表中。 路由协议 内部网关协议&#xff08;IGP&…

【C++项目】高并发内存池第六讲 当申请内存大于256K时的处理

目录 1.申请过程2.释放过程 1.申请过程 当申请的内存大于256kb时直接向堆中申请&#xff1a; static void* ConcurrentAlloc(size_t size) {if (size > MAX_BYTES){size_t alignSize SizeClass::RoundUp(size);size_t kpage alignSize >> PAGE_SHIFT;PageCache::…

数据隐私保护的方法有哪些?

数据隐私保护的方法有哪些&#xff1f; 安企神U盘管理系统下载使用 互联网时代的到来&#xff0c;给我们的生活带来极大的方便&#xff0c;但也给我们保护隐私数据带来巨大的挑战&#xff0c;数据隐私保护是确保个人或企业数据和敏感信息不被未经授权的访问或滥用的关键问题。…

CPU 与简单模型机实验

实验报告 实验名称&#xff1a; CPU 与简单模型机实验 日期&#xff1a; ----.--.-- 班级&#xff1a; ----------- 学号&#xff1a; ------------ 姓名&#xff1a; ---------- 一、实验目的&#xff1a; 1、 掌握一个简单CPU 的组成原理&#xff1b; 2、 在掌…