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

news2025/1/15 22:57:08

在这里插入图片描述

第1题:漫漫回国路

2020年5月,国际航班机票难求。一位在美国华盛顿的中国留学生,因为一些原因必须在本周内回到北京。现在已知各个机场之间的航班情况,求问他回不回得来(不考虑转机次数和机票价格)。
时间限制:1000
内存限制:65536
输入
第一行为case个数n(n < 10)。 每一个case,第一行为机场个数N,N ≤ 10。 之后的N行,每一行包含N个整数。第i(1 ≤ i ≤ N)行的第j(1 ≤ j ≤ N)个整数代表从第i个机场出发到第j个机场的能买到的航班的最低票价t(0 < t < 10000)。如果不幸没有航班,那么用-1表示。第i行第i个整数为0。 起点华盛顿杜勒斯国际机场的编号为1,终点北京首都国际机场的编号为N。
输出
每一个case一行。 能够回国,输出字符串:YES。如果无法回国,输出字符串:NO
样例输入
2
3
0 100 -1
-1 0 200
-1 -1 0
4
0 1 5 -1
3 0 1 -1
2 4 0 -1
4 1 1 0
样例输出
YES
NO

下面是使用搜索剪枝技术(深度优先搜索)实现的代码示例:

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

#define MAX_N 10
#define INF 10000

int airports[MAX_N][MAX_N];  // 存储机场之间的航班票价
bool visited[MAX_N];  // 记录机场是否被访问过

int n;  // 机场个数
bool found;  // 是否找到回国路径

void dfs(int start, int end) {
    if (start == end) {
        found = true;  // 找到回国路径
        return;
    }

    visited[start] = true;

    for (int i = 1; i <= n; i++) {
        if (!visited[i] && airports[start][i] != -1) {
            dfs(i, end);
        }
    }
}

bool canReturn() {
    found = false;

    for (int i = 1; i <= n; i++) {
        visited[i] = false;
    }

    dfs(1, n);

    return found;
}

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

    while (cases--) {
        scanf("%d", &n);

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

        if (canReturn()) {
            printf("YES\n");
        } else {
            printf("NO\n");
        }
    }

    return 0;
}

这段代码使用深度优先搜索(DFS)算法来判断是否存在一条路径从起点到终点,即从华盛顿到北京。通过维护一个布尔数组 visited 来记录机场是否被访问过,初始时都置为 false。搜索过程中,从起点开始逐个尝试访问每个机场,如果当前机场未被访问且存在航班,则递归地访问下一个机场。如果到达终点,则设置 foundtrue,表示找到回国路径。最终根据 found 的值判断是否能够回国。

请注意,上述代码中使用了一些辅助变量和数据结构(如 foundvisited 数组),这些需要根据实际情况进行定义和实现。

这段代码实现了搜索剪枝技术,并根据题目描述的输入和输出格式进行了相应的处理。你可以将题目给出的示例输入复制到代码中进行测试。

第2题:通配符匹配

给定一个字符串s和一个字符模式p,请实现一个支持’?‘和’*'的通配符匹配功能。
其中‘?’可以匹配任何单个字符,如‘a?c’可以成功匹配‘aac’,‘abc’等字符串,但不可匹配‘ac’,‘aaac’等字符串 。
‘*’ 可以匹配任意长度字符串(包括空字符串),如‘a*c’可以成功匹配‘ac’,‘abdc’,‘abc’,‘aaac’等字符串,但不可匹配‘acb’,‘cac’等字符串。
两个字符串完全匹配才算匹配成功。
时间限制:2000
内存限制:262144
输入
输入为一个数字n表示测试字符串与字符模式对数,换行。(n ≤ 30) 后续2n行为每组匹配的s与p,每行字符串后换行。 s 非空,只包含从 a-z 的小写字母。 p 非空,只包含从 a-z 的小写字母,以及字符 ? 和 *。 字符串s和p的长度均小于50
输出
每一组匹配串匹配成功输出‘yes’,否则输出‘no’。
样例输入
3
abc
abc
abc
a*c
abc
a??c
样例输出
yes
yes
no

下面是使用贪心算法实现的代码示例:

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

bool isMatch(char *s, char *p) {
    int sLen = strlen(s);
    int pLen = strlen(p);
    int sIndex = 0;  // 字符串s的索引
    int pIndex = 0;  // 字符模式p的索引
    int sStar = -1;  // 字符串s中上一个匹配'*'的位置
    int pStar = -1;  // 字符模式p中上一个匹配'*'的位置

    while (sIndex < sLen) {
        if (pIndex < pLen && (s[sIndex] == p[pIndex] || p[pIndex] == '?')) {
            sIndex++;
            pIndex++;
        } else if (pIndex < pLen && p[pIndex] == '*') {
            sStar = sIndex;
            pStar = pIndex;
            pIndex++;
        } else if (pStar != -1) {
            sStar++;
            sIndex = sStar;
            pIndex = pStar + 1;
        } else {
            return false;
        }
    }

    while (pIndex < pLen && p[pIndex] == '*') {
        pIndex++;
    }

    return pIndex == pLen;
}

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

    while (n--) {
        char s[51];
        char p[51];
        scanf("%s", s);
        scanf("%s", p);

        if (isMatch(s, p)) {
            printf("yes\n");
        } else {
            printf("no\n");
        }
    }

    return 0;
}

这段代码使用贪心算法来进行通配符匹配。在匹配过程中,使用两个索引 sIndexpIndex 分别表示当前匹配到的字符串 s 和字符模式 p 的位置。遍历字符串 s 的每个字符,根据字符模式 p 的当前字符进行匹配。

如果字符模式 p 的当前字符与字符串 s 的当前字符相等,或者字符模式 p 的当前字符为 '?',则匹配成功,将索引 sIndexpIndex 同时向后移动一位。

如果字符模式 p 的当前字符为 '*',则记录下当前位置,并将 pIndex 向后移动一位。

如果匹配失败且上一个匹配到的 p 中存在 '*',则将字符串 s 的索引 sIndex 后移一位,将字符模式 p 的索引 pIndex 重置为上一个 '*' 的下一位,并将上一个匹配到的 s 中的 '*' 的位置 sStar 后移一位。

如果匹配失败且不存在上一个匹配到的 p 中的 '*',则返回 false。

最后,检查字符模式 p 是否已经匹配完毕,如果 pIndex 等于 pLen,则匹配成功;否则,匹配失败。

这段代码实现了贪心算法,并根据题目描述的输入和输出格式进行了相应的处理。你可以将题目给出的示例输入复制到代码中进行测试。

第3题:求逆序对数

对于一个长度为N的整数序列A,满足i < j 且 Ai > Aj.的数对(i,j)称为整数序列A的一个逆序
<j<=n且ai><j<=n且ai><j<=n且ai><j<=n且ai>
请求出整数序列A的所有逆序对个数
时间限制:500
内存限制:65536
输入
输入包含多组测试数据,每组测试数据有两行 第一行为整数N(1 <= N <= 20000),当输入0时结束 第二行为N个整数,表示长为N的整数序列
输出
每组数据对应一行,输出逆序对的个数
样例输入
5
1 2 3 4 5
5
5 4 3 2 1
1
1
0
样例输出
0
10
0

下面是使用分治技术实现的代码示例:

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

long long merge(int arr[], int temp[], int left, int mid, int right) {
    int i = left;   // 左子数组索引
    int j = mid + 1;  // 右子数组索引
    int k = left;  // 合并后数组索引
    long long count = 0;  // 逆序对个数

    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) {
            temp[k++] = arr[i++];
        } else {
            temp[k++] = arr[j++];
            count += mid - i + 1;  // 统计逆序对个数
        }
    }

    while (i <= mid) {
        temp[k++] = arr[i++];
    }

    while (j <= right) {
        temp[k++] = arr[j++];
    }

    for (int m = left; m <= right; m++) {
        arr[m] = temp[m];
    }

    return count;
}

long long mergeSort(int arr[], int temp[], int left, int right) {
    long long count = 0;

    if (left < right) {
        int mid = (left + right) / 2;
        count += mergeSort(arr, temp, left, mid);
        count += mergeSort(arr, temp, mid + 1, right);
        count += merge(arr, temp, left, mid, right);
    }

    return count;
}

long long countInversions(int arr[], int n) {
    int* temp = (int*)malloc(sizeof(int) * n);
    long long count = mergeSort(arr, temp, 0, n - 1);
    free(temp);
    return count;
}

int main() {
    int n;

    while (scanf("%d", &n) == 1 && n != 0) {
        int* arr = (int*)malloc(sizeof(int) * n);

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

        long long count = countInversions(arr, n);
        printf("%lld\n", count);

        free(arr);
    }

    return 0;
}

这段代码使用分治技术中的归并排序来求逆序对个数。首先实现了一个 merge() 函数,用于合并两个有序子数组,并统计逆序对的个数。然后实现了 mergeSort() 函数,使用递归进行归并排序,并在合并过程中统计逆序对的个数。最后,实现了 countInversions() 函数,调用归并排序函数并返回逆序对的个数。

在主函数中,根据题目要求的输入格式,循环读取多组测试数据。对于每组测试数据,先动态分配一个数组来存储整数序列。然后使用 scanf() 逐个读取整数并存入数组中。调用 countInversions() 函数计算逆序对的个数,并输出结果。

这段代码实现了分治技术,并根据题目描述的输入和输出格式进行了相应的处理。你可以将题目给出的示例输入复制到代码中进行测试。

第4题:分成互质组

给定n个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?
时间限制:1000
内存限制:65536
输入
第一行是一个正整数n。1 <= n <= 10。 第二行是n个不大于10000的正整数。
输出
一个正整数,即最少需要的组数。
样例输入
6
14 20 33 117 143 175
样例输出
3

下面是使用搜索剪枝技术实现的代码示例:

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

bool isCoprime(int a, int b) {
    // 辗转相除法判断两个数是否互质
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }

    return a == 1;
}

void dfs(int nums[], int n, int group[], int index, int count, int *minCount) {
    if (index == n) {
        if (count < *minCount) {
            *minCount = count;
        }
        return;
    }

    // 尝试将当前数放入已有的组中
    for (int i = 0; i < count; i++) {
        if (isCoprime(nums[index], nums[group[i]])) {
            group[i] = index;
            dfs(nums, n, group, index + 1, count, minCount);
            group[i] = -1;  // 回溯
        }
    }

    // 尝试新建一组
    group[count] = index;
    dfs(nums, n, group, index + 1, count + 1, minCount);
    group[count] = -1;  // 回溯
}

int minGroups(int nums[], int n) {
    int group[10];  // 存储分组信息
    for (int i = 0; i < 10; i++) {
        group[i] = -1;  // 初始化为-1
    }

    int minCount = n;  // 最少组数初始化为n
    dfs(nums, n, group, 0, 0, &minCount);
    return minCount;
}

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

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

    int minCount = minGroups(nums, n);
    printf("%d\n", minCount);

    return 0;
}

这段代码使用搜索剪枝技术来求解将给定的正整数分成互质组的最少组数。首先实现了 isCoprime() 函数,用于判断两个数是否互质。然后实现了 dfs() 函数,使用深度优先搜索来尝试将每个数放入已有的组中或新建一组,并更新最少组数。最后,实现了 minGroups() 函数,调用深度优先搜索函数并返回最少组数。

在主函数中,根据题目要求的输入格式,先读取正整数的个数 n。然后使用 scanf() 逐个读取正整数并存入数组中。调用 minGroups() 函数计算最少组数,并输出结果。

这段代码实现了搜索剪枝技术,并根据题目描述的输入和输出格式进行了相应的处理。你可以将题目给出的示例输入复制到代码中进行测试。

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

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

相关文章

idea 链接mysql连不上

打开文件 C:\Program Files\JetBrains\IntelliJ IDEA 2023.2.1\jbr\conf\security\java.security修改内容 搜索&#xff1a;jdk.tls.disabledAlgorithms 修改 链接地址 在链接后面添加 ?useSSLfalse jdbc:mysql://127.0.0.1:3306/db_admin3?useSSLfalse

java+jsp+servlet+mysql蛋糕商城

项目介绍&#xff1a; 本系统为基于jspservletmysql的蛋糕商城&#xff0c;包含管理员和用户角色&#xff0c;用户功能如下&#xff1a; 用户&#xff1a;注册、登录系统&#xff1b;查看商品分类&#xff1b;查看热销、新品商品&#xff1b;查看商品详情&#xff1b;搜索商品…

XSS漏洞及复现

一、什么是XSS 跨站脚本( Cross-site Scripting )攻击&#xff0c;攻击者通过网站输入框输入payload(脚本代码 )&#xff0c;当用户访问网页时&#xff0c;恶意payload自动加载并执行&#xff0c;以达到攻击者目的( 窃取cookie、恶意传播、钓鱼欺骗等)为了避免与HTML语言中的C…

(数学) 剑指 Offer 62. 圆圈中最后剩下的数字 ——【Leetcode每日一题】

❓ 剑指 Offer 62. 圆圈中最后剩下的数字 难度&#xff1a;简单 0, 1, ,n-1 这 n 个数字排成一个圆圈&#xff0c;从数字 0 开始&#xff0c;每次从这个圆圈里删除第 m 个数字&#xff08;删除后从下一个数字开始计数&#xff09;。求出这个圆圈里剩下的最后一个数字。 例如…

最新文献怎么找|学术最新前沿文献哪里找

查找下载最新文献最好、最快、最省事的方法就是去收录该文献的官方数据库中下载。举例说明&#xff1a; 有位同学求助下载一篇2023年新文献&#xff0c;只有DOI号10.1038/s41586-023-06281-4&#xff0c;遇到这种情况可以在DOI号前加上http://doi.org/输入地址栏查询该文献的篇…

数据结构:排序解析

文章目录 前言一、常见排序算法的实现1.插入排序1.直接插入排序2.希尔排序 2.交换排序1.冒泡排序2.快速排序1.hoare版2.挖坑版3.前后指针版4.改进版5.非递归版 3.选择排序1.直接选择排序2.堆排序 4.归并排序1.归并排序递归实现2.归并排序非递归实现 5.计数排序 二、排序算法复杂…

DDR2 IP核调试记录1

一、IP核生成不成功可能原因 1、打开 Quartus II 软件时&#xff0c;请右键选择以管理员方式运行&#xff0c;切记&#xff0c;否则可能导致 IP 生成不成功。 2、创建工程时不要将工程创建在和 Quartus II 安装目录相同的盘符下&#xff0c;否则可能导致生产 IP 失败。 3、如果…

Revit SDK:AutoJoin 自动合并体量

前言 Revit 有一套完整的几何造型能力&#xff0c;每一个体量都是一个GenericForm&#xff0c;这些体量可以通过拉伸、扫掠等创建。这个例子介绍如何将他们合并成一个体量。 内容 合并体量的关键接口&#xff1a; // Autodesk.Revit.DB.Document public GeomCombination Com…

提升eBay、亚马逊搜索排名:测评自养号战略揭秘

想要在跨境市场上获得更多销售额&#xff0c;让客户可见非常重要。而自养号测评是个不错的选择&#xff0c;可以帮助您提高排名和产品知名度。许多因素共同作用&#xff0c;吸引更多客户关注您的产品。 网上购物也以同样的方式进行。人们在亚马逊上搜索特定产品并寻找一些选择…

【核心复现】基于改进灰狼算法的并网交流微电网经济优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Acwing 1233. 全球变暖 (每日一题)

如果你觉得这篇题解对你有用&#xff0c;可以点个赞或关注再走呗&#xff0c;谢谢你的关注~ 题目描述 你有一张某海域 NN 像素的照片&#xff0c;”.”表示海洋、”#”表示陆地&#xff0c;如下所示&#xff1a; … .##… .##… …##. …####. …###. … 其中”上下左右”…

基于法医调查算法优化的BP神经网络(预测应用) - 附代码

基于法医调查算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于法医调查算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.法医调查优化BP神经网络2.1 BP神经网络参数设置2.2 法医调查算法应用 4.测试结果&#xff1a;5…

八、性能测试

八、性能测试 8.1 性能测试代码 #include"ConcurrentAlloc.h"// ntimes 一轮申请和释放内存的次数 // rounds 轮次 void BenchmarkMalloc(size_t ntimes, size_t nworks, size_t rounds) {std::vector<std::thread> vthread(nworks);std::atomic<size_t&g…

活动预告 | 龙智、紫龙游戏与JFrog专家将出席龙智DevSecOps研讨会,探讨企业大规模开发创新

2023年9月8日&#xff08;周五&#xff09;下午13:30-19:45&#xff0c;龙智即将携手Atlassian与JFrog在上海共同举办主题为“大规模开发创新&#xff1a;如何提升企业级开发效率与质量”的线下研讨会。 在此次研讨会上&#xff0c;龙智高级咨询顾问、Atlassian认证专家叶燕秀…

七、高并发内存池--Page Cache

七、高并发内存池–Page Cache 7.1 PageCache的工作原理 PageCache是以span的大小(以页为单位)和下标一一对应为映射关系的哈希桶&#xff0c;下标是几就说明这个哈希桶下挂的span的大小就是几页的&#xff0c;是绝对映射的关系。因为PageCache也是全局只有唯一一个的&#x…

VMware 设置仅主机模式无法访问外网的问题说明

参考链接 VMware仅主机模式访问外网 如果根据以上参看仍旧无法访问物理机网段其他设备以及无法访问外网&#xff0c;可以尝试在虚拟机上根据 vmnet1 网卡设置的 ip 地址添加默认路由&#xff0c;如下图所示&#xff1a; 首先查看对应网卡设置的 ip 地址&#xff08;博主为啥…

Java从入门到精通-流程控制(一)

流程控制 1.复合语句 复合语句&#xff0c;也称为代码块&#xff0c;是一组Java语句&#xff0c;用大括号 {} 括起来&#xff0c;它们可以被视为单个语句。复合语句通常用于以下情况&#xff1a; - 在控制结构&#xff08;如条件语句和循环&#xff09;中包含多个语句。 - …

MYSQL(索引、事务)

文章目录 一、索引二、事务 一、索引 数据库中的表、数据、索引之间的关系&#xff0c;类似于书架上的图书、书籍内容和书籍目录的关系 1. 概述 概念&#xff1a;相当于是一本书的目录&#xff0c;是以‘列’为维度进行建立的使用场景&#xff1a;如果我们要查询一个表中的某个…

管理类联考——逻辑——汇总篇——知识点突破——形式逻辑——性质模态——负命题

角度 角度——汇总 角度——汇总 矛盾关系 性质 (1) 所有的 S 是 P 所有的S是P 所有的S是

Linux中创建文件夹,删除文件夹

Linux中创建目录&#xff1a;mkdir 文件夹&#xff0c; 比如&#xff1a;mkdir test 删除文件夹&#xff1a;rm -rf 文件夹&#xff0c; 比如&#xff1a;rm -rf soft vi强制不保存退出命令&#xff1a;q&#xff01;