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

news2024/11/17 1:48:29

在这里插入图片描述

第1题:找和为K的两个元素

在一个长度为n(n < 1000)的整数序列中,判断是否存在某两个元素之和为k。
时间限制:1000
内存限制:65536
输入
第一行输入序列的长度n和k,用空格分开。 第二行输入序列中的n个整数,用空格分开。
输出
如果存在某两个元素的和为k,则输出yes,否则输出no。
样例输入
9 10
1 2 3 4 5 6 7 8 9
样例输出
yes

要解决这个问题,可以使用双重循环来遍历所有可能的元素对,判断它们的和是否等于给定的目标值k。

以下是解题的基本思路:

(1)读取输入的序列长度n和目标和k。

(2)创建一个长度为n的整数数组,用于存储输入的序列。

(3)使用一个外部循环,遍历数组中的每个元素,假设当前元素为nums[i]。

(4)在外部循环内部,使用一个内部循环,从当前元素的下一个位置开始遍历数组中的其他元素,假设当前元素为nums[j]。

(5)在内部循环中,判断nums[i]和nums[j]的和是否等于目标和k。

  • 如果相等,表示找到了一对元素的和为k,输出"yes",并结束程序。

  • 如果不相等,则继续内部循环,遍历下一个元素。

(6)如果遍历完所有元素后仍未找到满足条件的元素对,输出"no"。

这个算法的时间复杂度为O(n^2),其中n为序列的长度。由于题目给出的时间限制为1000,这个算法在输入规模不超过1000时可以在给定时间内解决问题。

下面是一个使用C语言编写的解决方案:

#include <stdio.h>

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

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

    int found = 0;
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (nums[i] + nums[j] == k) {
                found = 1;
                break;
            }
        }
        if (found) {
            break;
        }
    }

    if (found) {
        printf("yes\n");
    } else {
        printf("no\n");
    }

    return 0;
}

这段代码首先读取输入的序列长度n和目标和k,然后读取n个整数到数组nums中。接下来,使用嵌套的for循环遍历所有可能的元素对,判断它们的和是否为k。如果找到一对和为k的元素,将found标记为1,并跳出循环。最后,根据found的值输出结果。

请注意,根据题目的要求,序列长度n不会超过1000,因此我们在代码中定义了一个长度为1000的数组nums来存储输入的整数序列。

第2题:Minecraft

Minecraft是一个几乎无所不能的沙盒游戏,玩家可以利用游戏内的各种资源进行创造,搭建自己的世界。
在Minecraft中,基本的建筑元素是边长为1个单位的立方体,Tony想用N个这种小立方体搭建一个长方体,并用他珍藏已久的贴纸对其进行装饰。如果一张贴纸可以贴满小立方体的一个面。那么,他需要用掉多少张贴纸呢?
时间限制:1000
内存限制:65536
输入
一个整数N,表示小明所拥有的小立方体的个数。N不会超过1000。
输出
一个整数,即小明最少用掉的贴纸有多少张。
样例输入
9
样例输出
30

这个问题可以通过计算来解决。我们知道一个长方体有6个面,每个面都需要用贴纸覆盖。而每个面都由多个小立方体组成,每个小立方体需要用一张贴纸覆盖。

以下是解题的基本思路:

(1)读取输入的小立方体的个数N。

(2)计算需要覆盖的面的总数,即6个面的总和。

(3)将需要覆盖的面的总数乘以N,得到所需的贴纸数量。

(4)输出所需的贴纸数量。

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

#include <stdio.h>

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

    int total_faces = 6;  // 一个长方体有6个面
    int stickers = total_faces * N;

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

    return 0;
}

这段代码首先读取输入的小立方体的个数N。然后,计算需要覆盖的面的总数,即6个面的总和。最后,将需要覆盖的面的总数乘以N,得到所需的贴纸数量。最后,输出所需的贴纸数量。

根据题目的要求,小立方体的个数N不会超过1000,因此我们可以直接在计算过程中处理较大的数值。

第3题:踩方格

有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:
a. 每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;
b. 走过的格子立即塌陷无法再走第二次;
c. 只能向北、东、西三个方向走;
请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。
时间限制:1000
内存限制:65536
输入
允许在方格上行走的步数n(n <= 20)
输出
计算出的方案数量
样例输入
2
样例输出
7

这个问题可以使用递归的方式来解决。每一步可以选择向北、东、西三个方向中的一个方向前进,然后在下一步中继续做出相同的选择,直到步数达到限制或无法再继续移动为止。

以下是解题的基本思路:

(1)读取输入的允许在方格上行走的步数n。

(2)定义一个递归函数countPaths,接受两个参数:当前位置的坐标(x, y)和剩余步数remainingSteps。

(3)在递归函数中,首先判断剩余步数是否为0,如果是则返回1,表示找到一种方案。

(4)否则,定义一个变量count初始值为0,用于记录方案数量。

(5)在递归函数中,分别递归调用countPaths函数,传入向北、东、西三个方向移动一步后的新坐标和剩余步数减1,将返回的结果累加到count中。

(6)最后,返回count作为当前位置和剩余步数的方案数量。

(7)在主函数中,调用countPaths函数,传入初始位置(0, 0)和允许的步数n,将返回的方案数量输出。

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

#include <stdio.h>

int countPaths(int x, int y, int remainingSteps) {
    if (remainingSteps == 0) {
        return 1;
    }

    int count = 0;
    count += countPaths(x, y + 1, remainingSteps - 1);  // 向北移动一步
    count += countPaths(x + 1, y, remainingSteps - 1);  // 向东移动一步
    count += countPaths(x - 1, y, remainingSteps - 1);  // 向西移动一步

    return count;
}

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

    int totalPaths = countPaths(0, 0, n);
    printf("%d\n", totalPaths);

    return 0;
}

这段代码首先读取输入的允许在方格上行走的步数n。然后,定义了一个递归函数countPaths来计算方案数量。在递归函数中,首先判断剩余步数是否为0,如果是则返回1,表示找到一种方案。否则,定义一个变量count用于记录方案数量,并分别递归调用countPaths函数,传入向北、东、西三个方向移动一步后的新坐标和剩余步数减1,将返回的结果累加到count中。最后,返回count作为当前位置和剩余步数的方案数量。

在主函数中,调用countPaths函数,传入初始位置(0, 0)和允许的步数n,将返回的方案数量输出。

根据题目的要求,允许在方格上行走的步数n不会超过20,因此递归的深度不会过大,可以在给定时间内解决问题。

第4题:苹果消消乐

有100个苹果和香蕉排成一条直线,其中有N个香蕉,你可以使用至多M次魔法道具将香蕉变成苹果,最后“最长的连续苹果数量”即为你本次苹果消消乐的得分,给定苹果和香蕉的排列,求你能获得的最大得分。
时间限制:1000
内存限制:65536
输入
第一行是一个整数T(1 <= T <= 10),代表测试数据的组数。 每个测试数据第一行是2个整数N和M(0 <= N, M <= 100)。第二行包含N个整数a1, a2, … aN(1 <= a1 < a2 < … < aN <= 100),表示第a1, a2, … aN个位置上摆放的是香蕉。
输出
对于每组数据,输出通过使用魔法道具后你能获得的最大得分。
样例输入
3
5 1
34 77 82 83 84
5 2
10 30 55 56 90
5 10
10 30 55 56 90
样例输出
76
59
100
提示
这是个枚举题

这个问题可以通过枚举的方式来解决。我们可以遍历每个位置,将其作为连续苹果的起始位置,然后向后遍历苹果和香蕉的排列,同时记录使用魔法道具的次数。在遍历过程中,如果遇到香蕉,且还有剩余的魔法道具可用,则将香蕉变成苹果,并增加得分。最后,找到最大的得分即可。

以下是解题的基本思路:

(1)读取输入的测试数据组数T。

(2)对于每组测试数据,读取香蕉和苹果的个数N和M。

(3)读取N个整数,表示香蕉的位置。

(4)初始化最大得分maxScore为0。

(5)遍历每个位置i作为连续苹果的起始位置:

  • 初始化当前得分score为0。

  • 初始化剩余魔法道具次数remainingMagic为M。

  • 遍历位置j从i到100:

    • 如果j是香蕉的位置且remainingMagic大于0,则将香蕉变成苹果,增加得分score,并减少剩余魔法道具次数remainingMagic。

    • 否则,增加得分score。

    • 如果得分score大于最大得分maxScore,则更新最大得分maxScore。

(6)输出最大得分maxScore。

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

#include <stdio.h>

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

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

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

        int maxScore = 0;
        for (int i = 0; i < 100; i++) {
            int score = 0;
            int remainingMagic = M;

            for (int j = i; j < 100; j++) {
                if (remainingMagic > 0 && j == bananas[score]) {
                    remainingMagic--;
                    score++;
                } else {
                    score++;
                }

                if (score > maxScore) {
                    maxScore = score;
                }
            }
        }

        printf("%d\n", maxScore);
    }

    return 0;
}

这段代码首先读取输入的测试数据组数T。然后,对于每组测试数据,读取香蕉和苹果的个数N和M,以及N个整数表示香蕉的位置。接下来,初始化最大得分maxScore为0,并进行枚举遍历。在遍历过程中,对于每个位置i作为连续苹果的起始位置,初始化当前得分score为0和剩余魔法道具次数remainingMagic为M。然后,遍历位置j从i到100,根据香蕉的位置和剩余魔法道具次数更新得分score,并更新最大得分maxScore。最后,输出最大得分maxScore。

根据题目的要求,测试数据组数T不会超过10,枚举的范围在100内,因此可以在给定时间内解决问题。

第5题:流感传染

有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
时间限制:1000
内存限制:65536
输入
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。 接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。 接下来的一行是一个整数m,m不超过100.
输出
输出第m天,得流感的人数
样例输入
5
…#
.#.@.
.#@…
#…

4
样例输出
16

这个问题可以使用广度优先搜索(BFS)来解决。我们可以将所有初始感染的人作为起始节点,然后以它们为中心向外扩散,每次将感染传播到相邻的健康人,直到达到指定的天数。

以下是解题的基本思路:

(1)读取输入的宿舍房间大小n。

(2)创建一个n*n的二维字符数组rooms来表示宿舍房间的状态。

(3)读取n行字符,将它们存储到rooms数组中。

(4)读取指定的天数m。

(5)创建一个队列,用于存储当前感染的人的坐标。

(6)遍历rooms数组,将初始感染的人的坐标加入队列。

(7)创建一个整数变量infectedCount,并将其初始值设置为队列的长度,表示初始感染的人数。

(8)创建一个整数变量days,并将其初始值设置为1,表示第一天。

(9)使用BFS算法进行传播:

  • 创建一个整数变量nextInfectedCount,用于记录下一天感染的人数。

  • 在循环中,从队列中取出一个感染的人的坐标。

  • 遍历该人的相邻人,如果相邻的人是健康的,则将其感染,并将其坐标加入队列。

  • 每次遍历一个感染的人的相邻人后,将nextInfectedCount增加相应的数量。

  • 如果队列不为空,则表示还有感染的人未传播完,将days增加1,更新infectedCount为nextInfectedCount。

  • 如果队列为空,则表示感染已经传播完,退出循环。

(10)如果指定的天数m大于等于第一天,则根据m和第一天的差值,使用BFS算法继续传播,直到达到指定的天数。

(11)输出最后一天感染的人数infectedCount。

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

#include <stdio.h>

#define MAX_N 100

typedef struct {
    int x;
    int y;
} Coordinate;

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

    char rooms[MAX_N][MAX_N];
    for (int i = 0; i < n; i++) {
        scanf("%s", rooms[i]);
    }

    int m;
    scanf("%d", &m);

    int dx[] = {-1, 0, 1, 0};
    int dy[] = {0, 1, 0, -1};

    Coordinate queue[MAX_N * MAX_N];
    int front = 0;
    int rear = 0;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (rooms[i][j] == '@') {
                Coordinate coord = {i, j};
                queue[rear++] = coord;
            }
        }
    }

    int infectedCount = rear;
    int days = 1;

    while (days < m) {
        int nextInfectedCount = 0;

        while (front < rear) {
            Coordinate current = queue[front++];

            for (int k = 0; k < 4; k++) {
                int nx = current.x + dx[k];
                int ny = current.y + dy[k];

                if (nx >= 0 && nx < n && ny >= 0 && ny < n && rooms[nx][ny] == '.') {
                    rooms[nx][ny] = '@';
                    Coordinate newCoord = {nx, ny};
                    queue[rear++] = newCoord;
                    nextInfectedCount++;
                }
            }
        }

        if (front == rear) {
            break;
        }

        days++;
        infectedCount += nextInfectedCount;
    }

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

    return 0;
}

这段代码首先读取输入的宿舍房间大小n,并创建一个n*n的二维字符数组rooms来表示宿舍房间的状态。然后,通过循环读取n行这个问题可以通过广度优先搜索(BFS)来解决。我们可以将感染的人作为起始点,然后以他们为中心向外扩散,每次将感染传播到相邻的健康人,直到达到指定的天数。

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

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

相关文章

Redis 扩展资料

Redis 扩展资料 1.缓存简介2.缓存分类3.常⻅缓存使⽤4.Redis 数据类型和使⽤5.持久化6.常⻅⾯试题7.Redis 集群&#xff08;选学&#xff09; 1.缓存简介 2.缓存分类 3.常⻅缓存使⽤ 4.Redis 数据类型和使⽤ 5.持久化 Redis 和 Memcached 有什么区别&#xff1f; 6.常⻅⾯试…

独立站SEO是什么意思?自主网站SEO的含义?

什么是独立站SEO优化&#xff1f;自建站搜索引擎优化是指什么&#xff1f; 独立站SEO&#xff0c;作为网络营销的重要一环&#xff0c;正在逐渐引起人们的关注。在当今数字化时代&#xff0c;独立站已经成为许多企业、个人宣传推广的首选平台之一。那么&#xff0c;究竟什么是…

【计算机视觉|生成对抗】StackGAN:使用堆叠生成对抗网络进行文本到照片逼真图像合成

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;StackGAN: Text to Photo-realistic Image Synthesis with Stacked Generative Adversarial Networks 链接&#xff1a;[1612.03242] StackGAN: Text to Photo-realistic Image Synthesis…

article-六轴机械臂(带抓手)运动学分析+轨迹规划

1正运动学分析 采用标准的D-h法进行机械腿模型分析&#xff1a; D-h表如下 &#xff08;2&#xff09;通过&#xff08;1&#xff09;求解出机器人各位姿变换矩阵后&#xff0c;求解机器人手臂变换矩阵 ** ** 。通过matlab 计算&#xff0c;写出机器人末端位置。 正运动学分…

爬虫框架- feapder + 爬虫管理系统 - feaplat 的学习简记

文章目录 feapder 的使用feaplat 爬虫管理系统部署 feapder 的使用 feapder是一款上手简单&#xff0c;功能强大的Python爬虫框架 feapder 官方文档 文档写的很详细&#xff0c;可以直接上手。 基本命令&#xff1a; 创建爬虫项目 feapder create -p first-project创建爬虫 …

【ES5和ES6】数组遍历的各种方法集合

一、ES5的方法 1.for循环 let arr [1, 2, 3] for (let i 0; i < arr.length; i) {console.log(arr[i]) } // 1 // 2 // 32.forEach() 特点&#xff1a; 没有返回值&#xff0c;只是针对每个元素调用func三个参数&#xff1a;item, index, arr &#xff1b;当前项&#…

D2: 基于go实现的一个DSL 绘图工具 高手效率神器

在b站看视频的时候, gin框架作作者appleboy 一直在推荐一个绘图工具 大佬认证 肯定有其过人之处 我去各网站收集(chao)了一些关于D2的东西 D2 是一种声明式流程图的领域特定语言 (DSL)&#xff0c;声明式只需要描述你想要的流程图即可&#xff0c;它就会自动生成对应的图像。…

Mac OS下应用Python+Selenium实现web自动化测试

在Mac环境下应用PythonSelenium实现web自动化测试 在这个过程中要注意两点&#xff1a; 1.在终端联网执行命令“sudo pip install –U selenium”如果失败了的话&#xff0c;可以尝试用命令“sudo easy_install selenium”来安装selenium; 2.安装好PyCharm后新建project&…

初体验深信服的云桌面

昨天上午深信服的工程师到这边来安装服务器&#xff0c;本想看一下具体的安装&#xff0c;但是上午有其他事情&#xff0c;没有看成&#xff0c;下午他给我讲了一下具体的使用&#xff0c;我体验了一下深信服的云桌面。 总体感觉管理员的维护和客户的使用都比较方便。 但是可能…

听GPT 讲Prometheus源代码--util

Prometheus的util目录包含了一些通用的工具模块,主要包含以下文件: buckets.go 这个文件定义了一些常用的指标采样值范围(Quantile buckets),如:0.001,0.01,0.05,0.5,0.9,0.95,0.99,0.999等。这些buckets常用于计算指标的分位数线。 regex.go 这个文件定义了一些正则表达式匹配…

Vue 2 访问元素和组件

通过Vue 2 组件基础一文的学习&#xff0c;我们知道组件之间可以通过传递props或事件来进行通信。 但在一些情况下&#xff0c;我们使用下面的方法将更有用。 1.访问根实例 根实例可通过this.$root获取。 我们在所有子组件中都可以像上面那样访问根实例&#xff0c;它就像一…

利用Jackson封装常用的JsonUtil工具类

在实际开发中&#xff0c;我们对于 JSON 数据的处理&#xff0c;通常有这么几个第三方工具包可以使用&#xff1a; gson&#xff1a;谷歌的fastjson&#xff1a;阿里巴巴的jackson&#xff1a;美国FasterXML公司的&#xff0c;Spring框架默认用的 由于以前一直用习惯了阿里的…

OpenLayers实战,OpenLayers判断点位是否与多边形有交集,判断车辆是否在电子围栏内

专栏目录: OpenLayers实战进阶专栏目录 前言 OpenLayers实战,OpenLayers判断点位是否与多边形有交集,可以用于判断车辆是否在电子围栏内,船舶是否在锚泊位中等常用案例。 在实际GIS地图业务开发中,一般是不会在前端实现是否在电子围栏这种计算的。 如果有人让你在前端实…

为什么TCP连接使用使用三次握手规则而不是两次?

TCP使用的是三报文握手来建立连接 当使用两报文握手建立连接时会发生什么样的情况呢&#xff1f; 如上图所示 假设一个TCP连接请求在网络中拥堵了&#xff0c;在规定的时间内未能到达TCP服务器&#xff0c;因此客户端重传该TCP连接请求 在双方建立连接并传输数据后&#xff0c…

基于CentOS7.9安装部署docker(简洁版)

安装部署 1基于官方脚本安装&#xff08;不推荐 不能自行选择版本&#xff09; 官方文档&#xff1a;https://docs.docker.com/engine/install/centos/ 2 使用yum安装 阿里云文档&#xff1a;docker-ce镜像_docker-ce下载地址_docker-ce安装教程-阿里巴巴开源镜像站 # ste…

git拉取远程代码到本地

目录 一、介绍 二、拉取代码到idea操作步骤 三、打通前后端连接的项目例子&#xff08;额外篇&#xff09; 一、介绍 本文是介绍如何从国内码云&#xff08;Gitee&#xff09;或者国外GitHub上面拉起代码项目&#xff08;若依&#xff09;到本地的&#xff0c;是通过idea202…

算法竞赛入门【码蹄集新手村600题】(MT1180-1200)C语言

算法竞赛入门【码蹄集新手村600题】(MT1180-1200&#xff09;C语言 目录MT1181 圆包含MT1182 圆相交MT1183 矩形包含MT1184 矩形相交MT1185 while循环MT1186 do-while循环MT1187 累加和MT1188 平均值MT1189 正数负数的和MT1190 分数乘法MT1191 减半MT1192 翻倍MT1193 偶数的平方…

Spring事件监听机制

前言 事件监听机制其原理就是观察者模式&#xff0c;而观察者模式又被称为发布-订阅模式。 观察者模式将有依赖关系的对象抽象为了观察者和主题两个不同的角色&#xff0c;多个观察者同时观察一个主题&#xff0c;两者只通过抽象接口保持松耦合状态&#xff0c;这样双方可以相…

C++11并发与多线程笔记(10) future其他成员函数、shared_future、atomic

C11并发与多线程笔记&#xff08;10&#xff09; future其他成员函数、shared_future、atomic 1、std::future 的成员函数1.1 std::future_status 2、std::shared_future&#xff1a;也是个类模板3、std::atomic原子操作3.1 原子操作概念引出范例&#xff1a;3.2 基本的std::at…

CTFhub-sql注入-绕过空格过滤

常用绕过空格过滤的方法&#xff1a; /**/、()、%0a 1.判断是否存在sqli注入 1 1/**/union/**/select/**/11 1/**/union/**/select/**/12 如果1/**/union/**/select/**/11的显示结果与1/**/union/**/select/**/12的显示结果不一样&#xff0c; 与1的结果一样说明存在注入…