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

在这里插入图片描述

第1题:统计误差范围内的数

统计一个整数序列中与指定数字m误差范围小于等于X的数的个数。
时间限制:5000
内存限制:65536
输入
输入包含三行:
第一行为N,表示整数序列的长度(N <= 100);
第二行为N个整数,整数之间以一个空格分开;
第三行包含2个整数,为指定的整数m,误差范围X。
输出
输出为N个数中与指定数字m误差范围小于等于X的数的个数。
样例输入
5
1 2 3 4 5
3 1
样例输出
3
提示
样例中2,3,4都满足条件,故答案为3

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

#include <stdio.h>
#include <stdlib.h>

int countNumbersInRange(int arr[], int n, int m, int x) {
    int count = 0;

    for (int i = 0; i < n; i++) {
        // 计算当前数与指定数字m的差值的绝对值
        int diff = abs(arr[i] - m);

        // 如果差值小于等于误差范围x,则增加计数
        if (diff <= x) {
            count++;
        }
    }

    return count;
}

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

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

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

    int result = countNumbersInRange(arr, n, m, x);
    printf("%d\n", result);

    return 0;
}

你可以将上述代码保存为一个名为 “count.c” 的文件,并使用C编译器进行编译和运行。在输入整数序列的长度、整数序列、指定的整数m以及误差范围x后,程序将计算出与指定数字m误差范围小于等于x的数的个数,并进行输出。

在主函数中,我们首先读取整数序列的长度 n。然后,定义一个整数数组 arr 用于存储整数序列。

接下来,我们使用一个循环来读取整数序列的每个数,并将其存储在 arr 数组中。

然后,我们读取指定的整数m和误差范围x。

接着,我们调用 countNumbersInRange 函数来计算满足条件的数的个数。该函数使用一个循环遍历整数序列中的每个数,并计算当前数与指定数字m的差值的绝对值。如果差值小于等于误差范围x,则增加计数。

最后,我们输出计数结果。

请注意,这个解决方案假设输入是有效的,并且满足题目要求。如果输入超出限制范围,可能会导致输出错误。

第2题:全在其中

你设计了一个新的加密技术,可以用一种聪明的方式在一个字符串的字符间插入随机的字符串从而对信息进行编码。由于专利问题,我们将不会详细讨论如何在原有信息中产生和插入字符串。不过,为了验证你的方法,有必要写一个程序来验证原来的信息是否全在最后的字符串之中。
给定两个字符串s和t,你需要判断s是否是t的“子列”。也就是说,如果你去掉t中的某些字符,剩下字符将连接而成为s。
时间限制:1000
内存限制:65536
输入
输入包括多个测试样例。每一个都是由空格分隔的由字母数字ASCII字符组成的两个特定的字符串s和t。s和t的长度不超过100000
输出
对于每个测试样例,如果s是t的“子列”,则输出”Yes”,否则输出”No”
样例输入
sequence subsequence
person compression
VERDI
vivaVittorioEmanueleReDiItalia
caseDoesMatter CaseDoesMatter
样例输出
Yes
No
Yes
No

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

#include <stdio.h>
#include <string.h>

int isSubsequence(char s[], char t[]) {
    int len_s = strlen(s);
    int len_t = strlen(t);

    int i = 0, j = 0;
    while (i < len_s && j < len_t) {
        if (s[i] == t[j]) {
            i++;
        }
        j++;
    }

    if (i == len_s) {
        return 1; // s是t的子列
    } else {
        return 0; // s不是t的子列
    }
}

int main() {
    char s[100001];
    char t[100001];

    while (scanf("%s %s", s, t) != EOF) {
        int result = isSubsequence(s, t);

        if (result == 1) {
            printf("Yes\n");
        } else {
            printf("No\n");
        }
    }

    return 0;
}

你可以将上述代码保存为一个名为 “subsequence.c” 的文件,并使用C编译器进行编译和运行。在输入每个测试样例的字符串s和t后,程序将判断s是否是t的子列,并进行输出。

在主函数中,我们使用一个循环来读取每个测试样例的字符串s和t。scanf("%s %s", s, t) 用于读取两个字符串,并将它们分别存储在字符数组 st 中。

接下来,我们调用 isSubsequence 函数来判断s是否是t的子列。该函数使用两个指针 ij 来遍历字符串s和t,同时比较字符是否相等。如果字符相等,则将 i 指针向前移动,否则将 j 指针向前移动。最后,如果 i 的值等于s的长度,即 i == len_s,则说明s是t的子列。

最后,根据 isSubsequence 函数的返回值,我们输出 “Yes” 或 “No”。

请注意,这个解决方案假设输入是有效的,并且满足题目要求。如果输入超出限制范围,可能会导致输出错误。

第3题:Lab杯

“Lab杯”乒乓球赛就要在PKU的实验室之间举行了。人工智能实验室的学生都是乒乓球的狂热分子,都强烈希望代表实验室去比赛。但是由于名额限制,他们之中只能由一个人被选作代表。
为了让选择的过程公平,他们决定打一次单循环赛,每一对学生之间都打一场五局三胜的比赛。赢得最多比赛的人就将代表实验室去比赛。现在Ava手里有一份表,表里面记录了每一场比赛的比分。她应该让谁去比赛?
时间限制:5000
内存限制:131072
输入
输入包含一组测试数据。第一行包含n(2 ≤ n ≤ 100),实验室里学生的数目。接下来给出一个n × n矩阵A。矩阵的每一个元素都是0、1、2、3中的一个。第i行第j列的元素aij是第i个学生在和第j个学生的比赛中赢的局数。aij和aji(i ≠ j)正好有一个是3,另外一个小于3。矩阵的所有对角线元素都是0。
输出
输出赢了最多比赛的学生的编号。如果有平分,选择编号最小的。
样例输入
4
0 0 3 2
3 0 3 1
2 2 0 2
3 3 3 0
样例输出
4

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

#include <stdio.h>

int findLabCupWinner(int n, int A[][100]) {
    int winner = 1; // 假设第一个学生为赢家

    for (int i = 2; i <= n; i++) {
        int wins = 0; // 记录当前学生赢得的比赛局数

        for (int j = 1; j <= n; j++) {
            if (A[i][j] == 3) {
                wins++;
            }
        }

        if (wins > A[winner][1]) {
            winner = i; // 更新赢家编号
        } else if (wins == A[winner][1] && i < winner) {
            winner = i; // 若局数相同,选择编号最小的学生作为赢家
        }
    }

    return winner;
}

int main() {
    int n;
    while (scanf("%d", &n) != EOF) {
        int A[100][100];

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

        int winner = findLabCupWinner(n, A);
        printf("%d\n", winner);
    }

    return 0;
}

你可以将上述代码保存为一个名为 “lab_cup.c” 的文件,并使用C编译器进行编译和运行。在输入实验室学生的数目n以及比赛比分矩阵A后,程序将确定赢得最多比赛的学生的编号,并进行输出。

在主函数中,我们使用一个循环来读取每组测试数据。scanf("%d", &n) 用于读取实验室学生的数目n。然后,我们定义一个二维数组 A 来存储比赛比分矩阵。

接下来,我们使用两个嵌套的循环来读取比赛比分矩阵A的每个元素。

然后,我们调用 findLabCupWinner 函数来确定赢得最多比赛的学生的编号。该函数使用两个循环来遍历比赛比分矩阵A,并计算每个学生赢得的比赛局数。如果某个学生的局数大于当前最多局数的学生,或者局数相等但学生编号较小,则更新赢家编号。

最后,我们输出赢家编号。

请注意,这个解决方案假设输入是有效的,并且满足题目要求。如果输入超出限制范围,可能会导致输出错误。

第4题:有趣的跳跃

一个长度为n(n>0)的序列中存在“有趣的跳跃”当且仅当相邻元素的差的绝对值经过排序后正好是从1到(n-1)。例如,1 4 2 3存在“有趣的跳跃”,因为差的绝对值分别为3,2,1。当然,任何只包含单个元素的序列一定存在“有趣的跳跃”。你需要写一个程序判定给定序列是否存在“有趣的跳跃”。
时间限制:1000
内存限制:65536
输入
一行,第一个数是n(0 < n < 3000),为序列长度,接下来有n个整数,依次为序列中各元素,各元素的绝对值均不超过1,000,000,000
输出
一行,若该序列存在“有趣的跳跃”,输出"Jolly",否则输出"Not jolly"
样例输入
4 1 4 2 3
样例输出
Jolly

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

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

bool isJolly(int n, int arr[]) {
    bool diff[n-1]; // 用于记录差的绝对值是否出现过
    for (int i = 0; i < n-1; i++) {
        diff[i] = false;
    }

    for (int i = 1; i < n; i++) {
        int absoluteDiff = abs(arr[i] - arr[i-1]);

        if (absoluteDiff < 1 || absoluteDiff >= n || diff[absoluteDiff-1]) {
            return false; // 差的绝对值不在1到(n-1)范围内或者重复出现
        }

        diff[absoluteDiff-1] = true;
    }

    return true;
}

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

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

    bool result = isJolly(n, arr);

    if (result) {
        printf("Jolly\n");
    } else {
        printf("Not jolly\n");
    }

    return 0;
}

你可以将上述代码保存为一个名为 “jolly_jump.c” 的文件,并使用C编译器进行编译和运行。在输入序列的长度n以及序列的元素后,程序将判断该序列是否存在"有趣的跳跃",并进行输出。

在主函数中,我们首先读取序列的长度n,并定义一个整数数组 arr 来存储序列的元素。

接下来,我们使用一个循环来读取序列的元素,并将它们存储在数组 arr 中。

然后,我们调用 isJolly 函数来判断序列是否存在"有趣的跳跃"。该函数使用一个布尔数组 diff 来记录差的绝对值是否出现过。我们首先将 diff 数组中的所有元素初始化为 false

接下来,我们使用一个循环遍历序列中的相邻元素,并计算它们的差的绝对值。如果差的绝对值不在1到(n-1)范围内,或者差的绝对值重复出现,则说明序列不存在"有趣的跳跃",返回 false

如果序列中的所有差的绝对值都在1到(n-1)范围内且没有重复出现,则返回 true

最后,根据 isJolly 函数的返回值,我们输出 “Jolly” 或 “Not jolly”。

请注意,这个解决方案假设输入是有效的,并且满足题目要求。如果输入超出限制范围,可能会导致输出错误。

第5题:反反复复

Mo和Larry发明了一种信息加密方法。他们首先决定好列数,然后将信息(只包含字母)从上往下依次填入各列,并在末尾补充一些随机字母使其成为一个完整的字母矩阵。例如,若信息是“There’s no place like home on a snowy night”并且有5列,Mo会写成:
t o i o y
h p k n n
e l e a i
r a h s g
e c o n h
s e m o t
n l e w x
注意Mo只会填入字母,且全部是小写形式。在这个例子中,Mo用字母“x”填充了信息使之成为一个完整的矩阵,当然他使用任何字母都是可以的。
Mo根据这个矩阵重写信息:首先从左到右写下第一行,然后从右到左写下第二行,再从左到右写下第三行……以此左右交替地从上到下写下各行字母,形成新的字符串。这样,例子中的信息就被加密为:toioynnkpheleaigshareconhtomesnlewx。
你的工作是帮助Larry从加密后的信息中还原出原始信息(包括填充的字母)。
时间限制:1000
内存限制:65536
输入
第一行包含一个整数(范围2到20),表示使用的列数。 第二行是一个长度不超过200的字符串。
输出
一行,即原始信息。
样例输入
5
toioynnkpheleaigshareconhtomesnlewx
样例输出
theresnoplacelikehomeonasnowynightx

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

#include <stdio.h>
#include <string.h>

void decryptMessage(int cols, char message[]) {
    int len = strlen(message);
    int rows = len / cols;
    int extra = len % cols;
    int lettersInRow[cols];

    int row = 0, col = 0;
    int index = 0;
    int direction = 1; // 1表示从左到右,-1表示从右到左

    for (int i = 0; i < cols; i++) {
        lettersInRow[i] = (i < extra) ? (rows + 1) : rows;
    }

    while (index < len) {
        if (row == rows) {
            direction = -1; // 到达最后一行后改变方向
        } else if (row == 0) {
            direction = 1; // 到达第一行后改变方向
        }

        if (message[index] == 'x') {
            message[index] = 'a'; // 将填充的字母替换为'a'
        }

        index++;
        lettersInRow[col]--;

        if (direction == 1) {
            row++;
        } else {
            row--;
        }

        col += direction;
    }
}

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

    char message[201];
    scanf("%s", message);

    decryptMessage(cols, message);

    printf("%s\n", message);

    return 0;
}

你可以将上述代码保存为一个名为 “decrypt_message.c” 的文件,并使用C编译器进行编译和运行。在输入列数cols以及加密后的信息message后,程序将还原出原始信息,并进行输出。

在主函数中,我们首先读取列数cols,并定义一个字符数组 message 来存储加密后的信息。

接下来,我们调用 decryptMessage 函数来还原原始信息。该函数首先计算行数rows和剩余的额外字母数extra。然后,我们使用一个循环来初始化每行的字母数 lettersInRow 数组。

接下来,我们使用两个变量 rowcol 来追踪当前位置。我们使用一个变量 index 来遍历加密后的信息。我们还使用一个变量 direction 来指示当前行的写入方向,1表示从左到右,-1表示从右到左。

在循环中,我们首先检查是否到达最后一行或第一行,需要改变方向。然后,我们检查当前字母是否为填充字母"x",如果是,则将其替换为"a"。

接下来,我们更新 indexlettersInRow[col]rowcol 的值,根据方向和当前位置的移动。

最后,我们输出还原后的原始信息。

请注意,这个解决方案假设输入是有效的,并且满足题目要求。如果输入超出限制范围,可能会导致输出错误。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

把握数据要素,做数字化时代的弄潮儿

截至2022年6月&#xff0c;我国网民规模已经达到了10.51亿&#xff0c;人均上网时间达到了每周29.5个小时&#xff0c;并且这部分人群使用手机上网的比例为99.6%。如果把工作、睡眠以及其他的必要的时间算上的话&#xff0c;可以发现通过手机上网已经成为了人们日常中的一部分。…

浅谈人工智能技术与物联网结合带来的好处

物联网是指通过互联网和各种技术将设备进行连接&#xff0c;实时采集数据、交互信息的网络&#xff0c;对设备实现智能化自动化感知、识别和控制&#xff0c;给人们带来便利。 人工智能是计算机科学的一个分支&#xff0c;旨在研究和开发能够模拟人类智能的技术和方法。人工智能…

SpringBoot的配置文件以及日志设置

在使用SpringBoot开发的过程中我们通常会用到配置文件来设置配置信息 以及使用日志来进行记录我们的操作&#xff0c;方便我们对错误的定位 配置文件的作用在于&#xff1a;设置端口&#xff0c;设置数据库连接信息&#xff0c;设置日志等等 在SpringBoot中&#xff0c;配置…

【LangChain概念】了解语言链️:第2部分

一、说明 在LangChain的帮助下创建LLM应用程序可以帮助我们轻松地链接所有内容。LangChain 是一个创新的框架&#xff0c;它正在彻底改变我们开发由语言模型驱动的应用程序的方式。通过结合先进的原则&#xff0c;LangChain正在重新定义通过传统API可以实现的极限。 在上一篇博…

SpringBoot携带Jre绿色部署项目

文章目录 SpringBoot携带Jre绿色部署运行项目1. 实现步骤2. 自测项目文件目录及bat文件内容&#xff0c;截图如下&#xff1a;2-1 项目文件夹列表&#xff1a;2-2. bat内容 3. 扩展&#xff1a; 1.6-1.8版本的jdk下载 SpringBoot携带Jre绿色部署运行项目 说明&#xff1a; 实…

【Python】Web学习笔记_flask(5)——会话cookie对象

HTTP是无状态协议&#xff0c;一次请求响应结束后&#xff0c;服务器不会留下对方信息&#xff0c;对于大部分web程序来说&#xff0c;是不方便的&#xff0c;所以有了cookie技术&#xff0c;通过在请求和响应保温中添加cookie数据来保存客户端的状态。 html代码&#xff1a; …

css鼠标样式 cursor: pointer

cursor: none; cursor:not-allowed; 禁止选择 user-select: none; pointer-events:none;禁止触发事件, 该样式会阻止默认事件的发生&#xff0c;但鼠标样式会变成箭头

什么文件传输协议才能保障跨国文件传输安全又稳定

在当今的全球化时代&#xff0c;跨国文件传输是一种常见而又重要的需求&#xff0c;无论是个人还是企业&#xff0c;都需要通过网络来分享和交换各种类型和大小的文件。但是&#xff0c;跨国文件传输也面临着许多挑战和风险&#xff0c;如何选择一个合适的文件传输协议&#xf…

CUDA计算超时(TDR)和阻塞界面问题的处理参考方法

本文提供一种解决单个英伟达独立显卡(终端用户常见的情形)上计算密集导致程序崩溃和电脑界面卡死的问题参考方法,采取降低效率和花费更多时间的思路来解决崩溃和卡顿的问题,即让CPU占有率不是一直100%,也不会因为被TDR机制打断。 如上图,在GPU-Z软件中看到“GPU Load”没…

W5500-EVB-PICO 做UDP Server进行数据回环测试(七)

前言 前面我们用W5500-EVB-PICO 开发板在TCP Client和TCP Server模式下&#xff0c;分别进行数据回环测试&#xff0c;本章我们将用开发板在UDP Server模式下进行数据回环测试。 UDP是什么&#xff1f;什么是UDP Server&#xff1f;能干什么&#xff1f; UDP (User Dataqram P…

自动切换HTTP爬虫ip助力Python数据采集

在Python的爬虫世界里&#xff0c;你是否也被网站的IP封锁问题困扰过&#xff1f;别担心&#xff0c;我来教你一个终极方案&#xff0c;让你的爬虫自动切换爬虫ip&#xff0c;轻松应对各种封锁和限制&#xff01;快来跟我学&#xff0c;让你的Python爬虫如虎添翼&#xff01; 首…

解锁暑假云端生活:铁威马NAS助你打造个性化体验

暑假转眼过半&#xff0c;大家一定度过一段非常美好的时光吧。朋友圈被去各地旅游的、看各种演唱会的、各种各样的观影读后感刷屏...生活很精彩&#xff0c;但如何高效地管理、享受和分享自己的文件、照片和影音内容成为困扰我们的难题。在这方面&#xff0c;铁威马NAS成为了越…

使用python对图像加噪声

加上雨点噪声 import cv2 import numpy as npdef get_noise(img, value10):#生成噪声图像>>> 输入&#xff1a; img图像value 大小控制雨滴的多少 >>> 返回图像大小的模糊噪声图像noise np.random.uniform(0, 256, img.shape[0:2])# 控制噪声水平&#xff…

苹果支付的实现

由于app经常需要用到支付功能&#xff0c;然而ios用户&#xff0c;是无法用支付宝、微信进行支付&#xff0c;这时候只能用到苹果支付。苹果支付是苹果公司推出的一种在线支付方式&#xff0c;用户可以通过苹果支付购买应用、内购道具等等。 原理 苹果支付的实现原理是通过在…

二十二、责任链模式

目录 1、使用demo演示责任链模式2、传统方案解决oa系统审批3、传统方案解决oa系统审批存在的问题4、职责链模式基本介绍5、职责链模式原理类图6、职责链模式解决oa系统采购审批7、职责链模式的注意事项和细节8、职责链模式的实际使用场景举例 1、使用demo演示责任链模式 学校o…

《论文阅读14》FAST-LIO

一、论文 研究领域&#xff1a;激光雷达惯性测距框架论文&#xff1a;FAST-LIO: A Fast, Robust LiDAR-inertial Odometry Package by Tightly-Coupled Iterated Kalman Filter IEEE Robotics and Automation Letters, 2021 香港大学火星实验室 论文链接论文github 二、论文概…

Qt 杂项(Qwt、样式等)

Qt隐藏窗口边框 this->setWindowFlags(Qt::FramelessWindowHint);Qt模态框 this->setWindowModality(Qt::ApplicationModal);QLable隐藏border 代码中设置 lable->setStyleSheet("border:0px");或者UI中直接设置样式&#xff1a;“border:0px” Qwt开源…

SRS流媒体服务(四)WebRTC实现实时视频通话和低延时互动直播

CentOS版本号&#xff1a;7.9 SRS版本号&#xff1a;4.0.215 服务器IP&#xff1a;192.168.5.104 注意需要开启端口号&#xff1a;1935、1985、8000&#xff08;UDP端口&#xff09;、8080。 注意需要开启服务&#xff1a;http 文章目录 webRTC介绍getUserMediaRTCPeerCon…

SpringBoot复习:(42)WebServerCustomizer的customize方法是在哪里被调用的?

ServletWebServletAutoConfiguration类定义如下&#xff1a; 可以看到其中通过Import注解导入了其内部类BeanPostProcessorRegister。 BeanPostProcessor中定义的registerBeanDefinition方法会被Spring容器调用。 registerBeanDefinitions方法调用了RegistrySyntheticBeanIf…

尚硅谷css3笔记

目录 一、新增长度单位 二、新增盒子属性 1.border-box 怪异盒模型 2.resize 调整盒子大小 3.box-shadow 盒子阴影 案例&#xff1a;鼠标悬浮盒子上时&#xff0c;盒子有一个过度的阴影效果 三、新增背景属性 1.background-origin 设置背景图的原点 2.background-clip 设置背…