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

news2024/11/24 6:55:36

在这里插入图片描述

第1题:课程冲突

小 A 修了 n 门课程, 第 i 门课程是从第 ai 天一直上到第 bi 天。
定义两门课程的冲突程度为 : 有几天是这两门课程都要上的。
例如 a1=1,b1=3,a2=2,b2=4 时, 这两门课的冲突程度为 2。
现在你需要求的是这 n 门课中冲突程度最大的两门课的冲突程度。
时间限制:1000
内存限制:65536
输入
第一行一个正整数 n 表示课程数量。接下来 n 行,每行两个正整数 ai,bi。 2 ≤ n≤ 1000, 1 ≤ai ≤bi ≤ 1000。
输出
输出一个整数表示最大的冲突程度。
样例输入
3
1 3
2 4
5 5
样例输出
2

题目要求找出n门课程中冲突程度最大的两门课的冲突程度。冲突程度表示有几天是这两门课程都要上的。

解题思路:

(1)创建一个长度为1001的数组conflict,用于记录每一天有几门课程要上。

(2)遍历每一门课程,对于每门课程的时间范围[a, b],将conflict[a]~conflict[b]的值都加1,表示这些天有一门课程要上。

(3)遍历conflict数组,找到冲突程度最大的值,即为最大的冲突程度。

下面是使用C语言编写的解题代码:

#include <stdio.h>

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

    int conflict[1001] = {0};  // 记录每一天的冲突程度

    int i;
    for (i = 0; i < n; i++) {
        int a, b;
        scanf("%d %d", &a, &b);

        int j;
        for (j = a; j <= b; j++) {
            conflict[j]++;
        }
    }

    int maxConflict = 0;
    for (i = 1; i <= 1000; i++) {
        if (conflict[i] > maxConflict) {
            maxConflict = conflict[i];
        }
    }

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

    return 0;
}

在上述代码中,我们首先创建一个长度为1001的数组 conflict,用于记录每一天的冲突程度。初始时,数组中所有元素都为0。

然后,我们使用一个循环遍历每一门课程。对于每门课程的时间范围 [a, b],我们将 conflict[a]conflict[b] 的值都加1,表示这些天有一门课程要上。

接下来,我们再次遍历 conflict 数组,找到冲突程度最大的值,即为最大的冲突程度。

最后,我们将结果输出。

编译并运行上述代码,即可得到最大的冲突程度。

第2题:42点

42是:
· 组合数学上的第5个卡特兰数
· 字符’*‘的ASCII码
· 钼的原子序数
· 6与9的乘积结果的13进制表示
· 生命、宇宙以及任何事情的终极答案
· 以及……表达式(1+5)/2*(6-4)*7的值
因此,小机器人Marvin发明了这个叫42点的小游戏。在这个游戏中,玩家会获得n个数。玩家需要使用’+‘、’-‘、’*‘、’/‘、’(‘、’)'以及这n个数构成一个合法的中缀表达式,并使得该表达式的值为42。n个数之间的顺序可以改变。表达式运算过程中只能出现整数。
由于过于抑郁,Marvin无力完成这个游戏,于是来找你帮忙。你的任务是对于给定的n个数,判断他们是否能根据上述游戏规则算出42。
时间限制:1000
内存限制:65536
输入
第一行为一个数n,1<=n<=6。 第二行为n个数,每个数均为[1,13]范围内的整数
输出
输出一行,若可以算出42则输出“YES”,否则输出“NO”(注意大小写)
样例输入
6
1 5 2 6 4 7
样例输出
YES

为了解决这个问题,我们可以使用回溯法来尝试所有可能的表达式组合。下面是使用C语言编写的解题代码:

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

bool canGet42(int nums[], int count, int sum) {
    if (count == 0) {
        if (sum == 42) {
            return true;  // 当前表达式的结果等于42
        } else {
            return false;  // 当前表达式的结果不等于42
        }
    }

    // 尝试将当前数字加入表达式并递归调用
    if (canGet42(nums + 1, count - 1, sum + nums[0])) {
        return true;
    }

    // 尝试将当前数字减去表达式并递归调用
    if (canGet42(nums + 1, count - 1, sum - nums[0])) {
        return true;
    }

    // 尝试将当前数字乘以表达式并递归调用
    if (canGet42(nums + 1, count - 1, sum * nums[0])) {
        return true;
    }

    // 如果当前数字不为0且能整除表达式,则尝试将当前数字除以表达式并递归调用
    if (nums[0] != 0 && sum % nums[0] == 0 && canGet42(nums + 1, count - 1, sum / nums[0])) {
        return true;
    }

    return false;  // 无法得到42
}

bool canGet42Wrapper(int nums[], int count) {
    int sum = 0;
    return canGet42(nums, count, sum);
}

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

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

    if (canGet42Wrapper(nums, n)) {
        printf("YES\n");  // 可以得到42
    } else {
        printf("NO\n");  // 无法得到42
    }

    return 0;
}

在上述代码中,我们定义了 canGet42 函数来实现回溯法。函数中,我们首先检查剩余可用的数字个数是否为0,如果是,则检查当前表达式的结果是否等于42。如果是,返回 true;否则,返回 false

然后,我们使用递归调用来尝试将当前数字加入、减去、乘以、除以表达式,并对剩余数字进行递归调用。在递归调用之前,我们将当前数字与表达式的结果进行相应的运算,并将剩余数字列表和数字个数进行更新。在递归调用之后,我们返回递归调用的结果。

main 函数中,我们首先读取输入的数字个数和数字列表。然后,我们调用 canGet42Wrapper 函数来判断是否可以得到42。如果可以,输出 “YES”;否则,输出 “NO”。

编译并运行上述的代码可以解决该问题。你可以使用 C 语言编译器将代码保存为 .c 文件,然后编译并运行该文件来获取结果。

请注意,该代码使用了递归,可能在数字个数较大时会导致栈溢出。由于题目中给定的数字个数最多为 6,这不会成为问题。但如果需要处理更多的数字,可能需要使用其他方法,如动态规划。

第3题:最长下坡

小明天天沿着未名湖环湖路跑,有时候也觉得蛮累。
累的时候跑下坡就很开心。小明想知道最长的一段下坡有多长。
环湖路是个圆形,周长n米。每隔一米测一下路面高度,两个测高点之间的高度是单调变化或不变的。
问最长的一段下坡有多少米长。小明只能顺时针跑。下坡必须高度单调减少。
时间限制:1000
内存限制:65536
输入
第一行是整数n,表示环湖路一共n米长(2<=n<=100)。 第二行是n个整数,每个整数范围[0,10000],按顺时针顺序给出了n个测高点的高度。
输出
最长下坡路段的长度。
样例输入
样例输入1:
5
2 1 5 6 3
样例输入2:
5
2 1 5 4 3
样例输入3:
4
1 1 1 1
样例输出
样例输出1:
3
样例输出2:
4
样例输出3:
0
提示
这是个简单枚举题,枚举起点即可

为了解决这个问题,我们可以使用枚举的方法来找到最长的下坡路段。

我们可以从每个点开始枚举,然后向右遍历环湖路,找到下坡的最大长度。为了方便处理环形结构,我们可以将环湖路的数组复制一份拼接在原数组的后面,以便在遍历时能够正确处理环路。

下面是使用 C 语言编写的解题代码:

#include <stdio.h>

int findLongestDownhill(int heights[], int n) {
    int maxDownhill = 0;  // 最长下坡长度
    int currentDownhill = 0;  // 当前下坡长度

    // 复制数组并拼接在原数组后面
    int extendedHeights[200];
    for (int i = 0; i < n; i++) {
        extendedHeights[i] = heights[i];
        extendedHeights[i + n] = heights[i];
    }

    // 枚举起点
    for (int i = 0; i < n; i++) {
        currentDownhill = 0;
        int j = i;

        // 向右遍历
        while (extendedHeights[j] > extendedHeights[j + 1]) {
            currentDownhill++;
            j++;

            // 更新最长下坡长度
            if (currentDownhill > maxDownhill) {
                maxDownhill = currentDownhill;
            }
        }
    }

    return maxDownhill;
}

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

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

    int longestDownhill = findLongestDownhill(heights, n);
    printf("%d\n", longestDownhill);

    return 0;
}

在上述代码中,我们定义了 findLongestDownhill 函数来寻找最长的下坡路段。函数中,我们首先创建一个扩展的高度数组 extendedHeights,将原高度数组复制一份并拼接在后面,以便在遍历时能够正确处理环路。

然后,我们使用两个循环嵌套来枚举起点和向右遍历。在遍历过程中,我们使用 currentDownhill 变量来记录当前下坡长度,并使用 maxDownhill 变量来记录最长下坡长度。如果当前下坡长度大于最长下坡长度,则更新最长下坡长度。

main 函数中,我们首先读取输入的环湖路长度和高度数组。然后,我们调用 findLongestDownhill 函数来找到最长的下坡路段,并将结果输出。

编译并运行上述的代码可以解决该问题。你可以使用 C 语言编译器将代码保存为 .c 文件,然后编译并运行该文件来获取结果。

第4题:吃糖果

现有n(20 > n > 0)个糖果,每天可以吃1个,也可以每天吃2个,也可以每天吃3个,请计算共有多少种不同的吃法。
时间限制:1000
内存限制:65536
输入
输入的每一行包括一组测试数据,即为糖果数n。最后一行为0,表示测试结束。
输出
每一行输出对应一行输入的结果,即为吃法的数目。
样例输入
1
2
3
4
0
样例输出
1
2
4
7

这个问题可以通过动态规划来解决。我们定义一个数组 dp,其中 dp[i] 表示有 i 个糖果时的吃法总数。

根据题目要求,每天可以吃 1 个、2 个或 3 个糖果。因此,对于 dp[i],可以从 dp[i-1]dp[i-2]dp[i-3] 中转移得到。具体转移方式如下:

dp[i] = dp[i-1] + dp[i-2] + dp[i-3]

初始条件为 dp[0] = 1dp[1] = 1dp[2] = 2,因为当没有糖果时只有一种吃法,当有一个糖果时也只有一种吃法,当有两个糖果时有两种吃法(可以吃一个糖果两次或者吃两个糖果一次)。

下面是使用 C 语言编写的解题代码:

#include <stdio.h>

int countEatWays(int n) {
    int dp[21];
    dp[0] = 1;
    dp[1] = 1;
    dp[2] = 2;

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

    return dp[n];
}

int main() {
    int n;

    while (1) {
        scanf("%d", &n);
        if (n == 0) {
            break;
        }

        int eatWays = countEatWays(n);
        printf("%d\n", eatWays);
    }

    return 0;
}

在上述代码中,我们定义了 countEatWays 函数来计算给定糖果数目下的吃法总数。我们使用动态规划的思想,从 0 到 n 遍历,计算每个数目下的吃法总数并存储在 dp 数组中。

main 函数中,我们使用一个循环来读取输入的糖果数目,并调用 countEatWays 函数来计算吃法总数,并将结果输出。当输入的糖果数目为 0 时,表示测试结束,循环终止。

编译并运行上述的代码可以解决该问题。你可以使用 C 语言编译器将代码保存为 .c 文件,然后编译并运行该文件来获取结果。

第5题:放苹果

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
时间限制:1000
内存限制:65536
输入
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出
对输入的每组数据M和N,用一行输出相应的K。
样例输入
1
7 3
样例输出
8

这个问题可以使用递归或动态规划来解决。我们可以定义一个函数 countWays,用于计算将 M 个苹果放入 N 个盘子中的分法总数。

递归方法:

  • 如果 MN 的值为 1,表示只有一个盘子或只有一个苹果,那么只有一种分法,即将所有苹果放入一个盘子中。

  • 如果 M 小于 N,则将问题转化为将 M 个苹果放入 M 个盘子中的分法总数,因为有的盘子可能为空。

  • 否则,将问题分成两种情况:一种是至少有一个盘子为空,另一种是所有盘子都至少有一个苹果。对于第一种情况,我们可以将问题转化为将 M 个苹果放入 N-1 个盘子中的分法总数;对于第二种情况,我们可以将问题转化为将剩余的 M-N 个苹果放入 N 个盘子中的分法总数。将这两种情况的分法总数相加即可得到结果。

下面是使用 C 语言编写的递归解题代码:

#include <stdio.h>

int countWays(int M, int N) {
    if (M == 1 || N == 1) {
        return 1;
    } else if (M < N) {
        return countWays(M, M);
    } else {
        return countWays(M, N - 1) + countWays(M - N, N);
    }
}

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

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

        int ways = countWays(M, N);
        printf("%d\n", ways);
    }

    return 0;
}

在上述代码中,我们定义了 countWays 函数来递归计算将 M 个苹果放入 N 个盘子中的分法总数。在函数中,我们首先处理特殊情况,即当 MN 的值为 1 时,返回 1。然后,我们根据问题的性质进行分情况讨论,计算不同情况下的分法总数,并将结果相加返回。

main 函数中,我们首先读取测试数据的数目 t。然后,使用一个循环来读取每组数据的 MN 值,并调用 countWays 函数来计算分法总数,并将结果输出。

编译并运行上述的代码可以解决该问题。你可以使用 C 语言编译器将代码保存为 .c 文件,然后编译并运行该文件来获取结果。

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

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

相关文章

vue 中 axios 的安装及使用

vue 中 axios 的安装及使用 1. axios 安装2. axios使用 1. axios 安装 首先&#xff0c;打开当前的项目终端&#xff0c;输入 npm install axios --save-dev验证是否安装成功&#xff0c;检查项目根目录下的 package.json,其中的 devDependencies 里面会多出一个axios及其版本…

【中国善网】资源对接(场地捐赠)公示

-----仰和百花心理咨询认领安利公益基金会捐赠场地 近日&#xff0c;经过中国善网与安利公益基金会的沟通与对接&#xff0c;仰和百花心理咨询获得免费认领安利公益基金会场地&#xff08;安利深圳体验馆&#xff09;8月22-25日为期4天的使用权&#xff0c;特此公示。为推动公…

(嵌入式c语言)类型修饰符

类型修饰符 对内存资源存储位置的限定 auto 默认的类型修饰符 修饰的变量可读可写 register 因为你内部寄存器比较少&#xff0c;使用此类型修饰符&#xff0c;会告诉编译器尽量把此数据放到寄存器。 CPU内部寄存器是编号来定义&#xff0c;无地址编号&#xff0c;所以r…

网络控价方法论

品牌为什么要做控价&#xff1f; 不做控价的品牌&#xff0c;会面对价值受损、经销商流失、口碑下降的局面&#xff0c;因为低价不是一家店铺的行为&#xff0c;会随着时间的推移&#xff0c;不断蔓延&#xff0c;当越来越多的店铺低价&#xff0c;则表示渠道越来越乱&#xf…

亚马逊或将更改付款期限?卖家如何有效应对?

据外媒报道&#xff0c;亚马逊将更改其付款期限&#xff0c;英国和欧洲的卖家必须等到商品交付一周后才能收到款项。这项变更将于9月1日至6日分阶段生效&#xff0c;目前亚马逊已经向欧洲和英国的卖家发出通知。 一、亚马逊付款期限调整有何影响&#xff1f; 据了解&#xff…

【Python原创设计】基于Python Flask的上海美食信息与可视化宣传网站项目-附下载方式以及往届优秀论文,原创项目其他均为抄袭

基于Python Flask的上海美食信息与可视化宣传网站&#xff08;获取方式访问文末官网&#xff09; 一、项目简介二、开发环境三、项目技术四、功能结构五、运行截图六、功能实现七、数据库设计八、源码获取 一、项目简介 随着大数据和人工智能技术的迅速发展&#xff0c;我们设…

【React基础全篇】

文章目录 一、关于 React二、脚手架2.1 create-react-app 脚手架的使用2.2 项目目录解析2.3 抽离配置文件2.4 webpack 二次封装2.4.1 集成 css 预处理器2.4.2 配置解析别名 2.5 setupProxy 代理 三、JSX3.1 jsx 语法详解3.2 React.createElement 四、组件定义4.1 类组件4.2 函数…

日常中msvcp140.dll丢失是什么原因,msvcp140.dll丢失4个解决方法

在计算机编程过程中&#xff0c;我们可能会遇到各种错误和问题。其中&#xff0c;丢失msvcp140.dll文件是一个常见的问题。msvcp140.dll是Microsoft Visual C 2015 Redistributable的一部分&#xff0c;它包含了运行许多应用程序所需的运行时库。当这个文件丢失时&#xff0c;可…

【Python原创设计】基于Python Flask的全国气象数据采集及可视化系统-附下载方式以及项目参考论文,原创项目其他均为抄袭

基于Python Flask的全国气象数据采集及可视化系统 一、项目简介二、项目技术三、项目功能四、运行截图五、分类说明六、实现代码七、数据库结构八、源码下载 一、项目简介 本项目是一个基于Web技术的实时气象数据可视化系统。通过爬取中国天气网的各个城市气象数据&#xff0c…

【Go语言】基于Socket编程的P2P通信程序示例

Go语言的Socket编程实现为开发者提供了一种高效且强大的方式来实现网络通信。通过Go语言的并发模型和内置的网络库&#xff0c;如net包&#xff0c;开发者可以轻松地创建基于套接字的通信应用。Go语言的goroutine和channel机制使并发处理变得简单&#xff0c;能够轻松处理多个连…

Address already in use: bind 如何解决端口号被占用

Address already in use: bind 程序报错&#xff0c;说明端口号已经被占用了。在不重启计算机的情况下&#xff0c;可通过如下方式解决 一&#xff1a; winR 快捷键 输入cmd指令打开黑框 二&#xff1a;输入指令 netstat -ano 查看端口号 三&#xff1a;根据端口号&#xff0c…

色差分量接口ESD静电保护推荐TVS二极管:DW03DLC-B-S和DW05R-E

YCbCr/YPbPr色差分量接口是S-Video端子的升级产品&#xff0c;支持1080P高清&#xff0c;由红、绿、蓝三种颜色的线组成&#xff0c;其中&#xff0c;蓝色和红色分别传输蓝色差信号&#xff08;Cb/Pb&#xff09;和红色差信号&#xff08;Cr/Pr&#xff09;&#xff0c;而绿色传…

【vue3+ts项目】配置husky+配置commitlint

上一篇文章中配置了eslint校验代码工具 【vue3ts项目】配置eslint校验代码工具&#xff0c;eslintprettierstylelint 1、配置husky 每次手动执行命令才能格式化代码&#xff0c;如果有人没有格式化就提交到远程仓库&#xff0c;这个规范就起不到作用了&#xff0c;所有需要强…

【C++初阶】模拟实现vector

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

【测试】pywinauto的简单使用(安装、常用对象、元素控件、鼠标操作、键盘操作)

1.说明 pywinauto是一个用于自动化Python 模块&#xff0c;适合Windows系统的软件&#xff08;GUI&#xff09;&#xff0c;可以通过Pywinauto遍历窗口&#xff08;对话框&#xff09;和窗口里的控件&#xff0c;也可以控制鼠标和键盘输入&#xff0c;所以它能做的事情比之前介…

鲁图中大许少辉博士八一新书《乡村振兴战略下传统村落文化旅游设计》山东省图书馆典藏

鲁图中大许少辉博士八一新书《乡村振兴战略下传统村落文化旅游设计》山东省图书馆典藏

数据宽度、KEIL汇编和GNU汇编的区别

数据宽度 DCB data control byte(byte) DCW data control half word(short) DCD data control word(int) DCQ data control (long)KEIL汇编和GNU汇编的区别 IDA关于please position the cursor within a funtion的解决 我是在C/C++反编译中出现的问题,因为在动态调试的时候…

ctfshow-web11

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 这里要求输入的passwd和session必需要相当&#xff0c;那么我们只要让密码和session都为空即可。 以上

Vue的Ajax请求-axios、前后端分离练习

Vue的Ajax请求 axios简介 ​ Axios&#xff0c;是Web数据交互方式&#xff0c;是一个基于promise [5]的网络请求库&#xff0c;作用于node.js和浏览器中&#xff0c;它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生node.js http模块, 而在…

%f占位符

介绍&#xff1a; %f &#xff0c;用来输出实数&#xff08;包括单双精度&#xff09;&#xff0c;以小数形式输出。 通常情况下&#xff0c;当输入的数值或者打印的数值是float类型数据时&#xff0c;使用%f &#xff0c;当然在精度更高的double数据类型下&#xff0c;也可以…