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

news2024/11/19 3:16:16

在这里插入图片描述

C/C++编程(1~8级)全部真题・点这里

第1题:最短路径问题

平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。
若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离。现在的任务是找出从一点到另一点之间的最短路径。
时间限制:1000
内存限制:131072
输入
共n+m+3行,其中: 第一行为整数n。 第2行到第n+1行(共n行) ,每行两个整数x和y,描述了一个点的坐标。 第n+2行为一个整数m,表示图中连线的个数。 此后的m 行,每行描述一条连线,由两个整数i和j组成,表示第i个点和第j个点之间有连线。 最后一行:两个整数s和t,分别表示源点和目标点。
输出
仅一行,一个实数(保留两位小数),表示从s到t的最短路径长度。
样例输入
5
0 0
2 0
2 2
0 2
3 1
5
1 2
1 3
1 4
2 5
3 5
1 5
样例输出
3.41

以下是一个解决最短路径问题的C语言程序:

#include <stdio.h>
#include <math.h>

#define MAXN 101

typedef struct {
    int x, y;
} Point;

double dist(Point p1, Point p2) {
    int dx = p2.x - p1.x;
    int dy = p2.y - p1.y;
    return sqrt(dx * dx + dy * dy);
}

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

    Point points[MAXN];
    int i;
    for (i = 0; i < n; i++) {
        scanf("%d %d", &points[i].x, &points[i].y);
    }

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

    int edges[MAXN][MAXN] = {0};
    int j;
    for (j = 0; j < m; j++) {
        int u, v;
        scanf("%d %d", &u, &v);
        edges[u][v] = 1;
        edges[v][u] = 1;
    }

    int s, t;
    scanf("%d %d", &s, &t);

    double dist[MAXN];
    int visited[MAXN] = {0};

    for (i = 0; i < n; i++) {
        dist[i] = INFINITY;
    }

    dist[s] = 0;

    for (i = 0; i < n - 1; i++) {
        int minDistIndex = -1;
        double minDist = INFINITY;

        for (j = 0; j < n; j++) {
            if (!visited[j] && dist[j] < minDist) {
                minDist = dist[j];
                minDistIndex = j;
            }
        }

        visited[minDistIndex] = 1;

        for (j = 0; j < n; j++) {
            if (!visited[j] && edges[minDistIndex][j] && dist[minDistIndex] + dist(points[minDistIndex], points[j]) < dist[j]) {
                dist[j] = dist[minDistIndex] + dist(points[minDistIndex], points[j]);
            }
        }
    }

    printf("%.2lf\n", dist[t]);

    return 0;
}

在这个解决方案中,我们使用了Dijkstra算法来求解最短路径问题。

首先,我们定义了一个结构体Point来表示平面上的点,包含x和y坐标。

然后,我们定义了一个dist函数来计算两点之间的直线距离。

在主函数中,我们首先读取输入的点的数量n。

然后,我们读取n行,每行包含两个整数x和y,表示一个点的坐标。

接下来,我们读取连线的数量m。

然后,我们读取m行,每行包含两个整数i和j,表示第i个点和第j个点之间有连线。

最后,我们读取源点s和目标点t。

接下来,我们创建一个邻接矩阵edges来表示点之间的连线关系。将连线的两个点在邻接矩阵中标记为1,表示有连线。

我们还创建一个距离数组dist来存储从源点到各个点的最短距离。

然后,我们进行n-1轮迭代,每次选择距离最小的未访问点,更新该点到其他未访问点的距离。

最后,输出从源点到目标点的最短路径长度。

综上所述,这个C语言程序可以根据输入的点的坐标和连线关系,求解从源点到目标点的最短路径长度,并输出结果。

第2题:Freda的越野跑

Freda报名参加了学校的越野跑。越野跑共有N人参加,在一条笔直的道路上进行。这N个人在起点处站成一列,相邻两个人之间保持一定的间距。比赛开始后,这N个人同时沿着道路向相同的方向跑去。换句话说,这N个人可以看作x轴上的N个点,在比赛开始后,它们同时向x轴正方向移动。
假设越野跑的距离足够远,这N个人的速度各不相同且保持匀速运动,那么会有多少对参赛者之间发生“赶超”的事件呢?
时间限制:1000
内存限制:262144
输入
第一行1个整数N。 第二行为N 个非负整数,按从前到后的顺序给出每个人的跑步速度。 对于50%的数据,2<=N<=1000。 对于100%的数据,2<=N<=100000。
输出
一个整数,表示有多少对参赛者之间发生赶超事件。
样例输入
5
1 3 10 8 5
样例输出
7
提示
我们把这5个人依次编号为A,B,C,D,E,速度分别为1,3,10,8,5。 在跑步过程中: B,C,D,E均会超过A,因为他们的速度都比A快; C,D,E都会超过B,因为他们的速度都比B快; C,D,E之间不会发生赶超,因为速度快的起跑时就在前边。

以下是一个解决Freda的越野跑问题的C语言程序:

#include <stdio.h>

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

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

    int count = 0;
    int maxSpeed = speeds[N - 1];

    for (i = N - 2; i >= 0; i--) {
        if (speeds[i] > maxSpeed) {
            count++;
        } else {
            maxSpeed = speeds[i];
        }
    }

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

    return 0;
}

在这个解决方案中,我们首先读取输入的参赛者数量N。

然后,我们创建一个长度为N的整数数组speeds来存储每个参赛者的速度。

接下来,我们使用一个循环读取N个非负整数,分别表示每个参赛者的速度,并将其存储在数组speeds中。

然后,我们初始化一个变量count为0,用于计数赶超事件的数量。

我们还定义一个变量maxSpeed,用于记录当前已经遍历的参赛者中的最大速度。

接下来,我们从倒数第二个参赛者开始向前遍历,比较每个参赛者的速度和当前最大速度。

如果某个参赛者的速度大于当前最大速度,说明发生了一次赶超事件,我们将count加1。

否则,更新maxSpeed为当前参赛者的速度,因为速度较慢的参赛者不会再被之后速度较快的参赛者赶超。

最后,输出count,表示发生赶超事件的数量。

综上所述,这个C语言程序可以根据输入的参赛者速度,计算出有多少对参赛者之间发生赶超事件,并输出结果。

第3题:社交网络

随着社交平台的兴起,人们之间的沟通变得越来越密切。通过Facebook的分享功能,只要你是对方的好友,你就可以转发对方的状态,并且你的名字将出现在“转发链”上。经过若干次转发以后,很可能A分享了一条好友C的状态,而C的这条状态实际上是分享B的,但A与B可能并不是好友,即A通过C间接分享了B的状态。
给定你N个人之间的好友关系,好友关系一定是双向的。只要两个人是好友,他们就可以互相转发对方的状态,无论这条状态是他自己的,还是他转发了其他人的。现在请你统计,对于每两个人,他们是否有可能间接转发对方的状态。
时间限制:1000
内存限制:262144
输入
第一行1个整数N(1<=N<=300)。 接下来N行每行N个整数,表示一个NN的01矩阵,若矩阵的第i行第j列是1,表示这两个人是好友,0则表示不是好友。 保证矩阵的主对角线上都是1,并且矩阵关于主对角线对称。
输出
一个N
N的01矩阵,若矩阵的第i行第j列是1,表示这两个人可能间接转发对方的状态,0则表示不可能。
样例输入
5
11000
11100
01100
00011
00011
样例输出
11100
11100
11100
00011
00011
提示
在输入数据中,1与2是好友,2与3是好友,4与5是好友。 因此1、2、3有可能互相转发状态;4、5有可能互相转发状态。这两组人之间则不可能。

以下是一个解决社交网络问题的C语言程序:

#include <stdio.h>

void calculateIndirectConnections(int N, int friends[][N], int indirectConnections[][N]) {
    int i, j, k;

    // 初始化indirectConnections矩阵为friends矩阵的拷贝
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            indirectConnections[i][j] = friends[i][j];
        }
    }

    // 使用Warshall算法计算间接转发关系
    for (k = 0; k < N; k++) {
        for (i = 0; i < N; i++) {
            for (j = 0; j < N; j++) {
                if (indirectConnections[i][k] && indirectConnections[k][j]) {
                    indirectConnections[i][j] = 1;
                }
            }
        }
    }
}

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

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

    int indirectConnections[N][N];
    calculateIndirectConnections(N, friends, indirectConnections);

    // 输出indirectConnections矩阵
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            printf("%d", indirectConnections[i][j]);
        }
        printf("\n");
    }

    return 0;
}

在这个解决方案中,我们首先读取输入的人数N。

然后,我们创建一个大小为N×N的二维数组friends,用于存储好友关系。我们使用两层循环读取N行N列的二进制矩阵,并将其存储在friends数组中。

接下来,我们创建一个大小为N×N的二维数组indirectConnections,用于存储间接转发关系。我们将friends数组的内容复制到indirectConnections数组中,作为初始的间接转发关系。

然后,我们使用Warshall算法来计算间接转发关系。通过三重循环遍历indirectConnections数组,如果第i个人与第k个人以及第k个人与第j个人存在间接转发关系,则更新第i个人与第j个人之间的间接转发关系为1。

最后,我们输出indirectConnections矩阵,即每两个人之间可能的间接转发关系。

综上所述,这个C语言程序可以根据好友关系,计算出每两个人之间是否可能存在间接转发关系,并输出结果。

第4题:旅行

转眼毕业了,曾经朝夕相处的同学们不得不都各奔东西,大家都去了不同的城市开始新的生活。在各自城市居住了一段时间后,他们都感到了一些厌倦,想去看看其他人的生活究竟如何,于是他们都选择到另一个同学所在城市去旅游,并且希望旅游的城市各不相同,他们想知道有多少种不同的方案,可是数量实在太多了,他们无法计算出来,你能帮助他们吗。
时间限制:10000
内存限制:131072
输入
一个正整数n(n<200),表示人数。
输出
一个数,表示有多少不同的方案。
样例输入
3
样例输出
2
提示
有如下两种方案: 同学1去同学2的城市,同学2去同学3的城市,同学3去同学1的城市; 同学1去同学3的城市,同学3去同学2的城市,同学2去同学1的城市。

这个问题可以使用动态规划来解决。我们可以将旅行的方案数量表示为一个状态转移方程,并使用动态规划的方法计算出所有可能的方案数量。

以下是一个解决旅行问题的C语言程序:

#include <stdio.h>

#define MAX_N 200

long long int travelPlans(int n) {
    // 创建一个大小为n的数组,用于存储状态转移方程的结果
    long long int dp[MAX_N];

    // 初始化dp数组
    dp[1] = 0;
    dp[2] = 1;

    int i;
    for (i = 3; i <= n; i++) {
        // 使用状态转移方程计算dp[i]
        dp[i] = (i - 1) * (dp[i - 1] + dp[i - 2]);
    }

    return dp[n];
}

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

    long long int result = travelPlans(n);
    printf("%lld\n", result);

    return 0;
}

在这个解决方案中,我们首先读取输入的人数n。

然后,我们创建一个大小为MAX_N的数组dp,用于存储状态转移方程的结果。

接下来,我们初始化dp数组的前两个元素,dp[1]为0,dp[2]为1。

然后,我们使用一个循环从3到n,计算dp[i]的值。根据状态转移方程,dp[i]等于(i-1)乘以(dp[i-1]+dp[i-2])。

最后,我们输出dp[n],即旅行的方案数量。

综上所述,这个C语言程序可以根据输入的人数,计算出旅行的不同方案数量,并输出结果。

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

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

相关文章

C++——STL容器【map和set】

文档&#xff1a;map、set 文章目录 &#x1f36f;1. 关联式容器&#x1fad6;2. set&#x1f37c;1. 模板参数&#x1f37c;2. 构造函数&#x1f37c;3. 修改&#x1f37c;4.操作&#x1f95b;find&#x1f95b;count&#x1f95b;lower_bound & upper_bound & equal_…

Increment Selection 插件

Increment Selection 插件实现递增 初次使用 按下快捷键 Alt Shift 鼠标左键向下拖拽 向下拖拽之后&#xff0c;在输入一个数字&#xff0c;比如我这里输入了一个数字1 然后按下快捷键 Ctrl Shift ← 进行选中数字 然后按下快捷键 Ctrl Alt i 建自动递增。 然后鼠标随…

网络是如何进行通信

网络是如何进行通信的 简介 在现代社会中&#xff0c;网络已经成为我们生活中不可或缺的一部分。从上网搜索信息、在线购物到远程工作和社交媒体&#xff0c;我们几乎无时无刻不与网络保持着联系。但是&#xff0c;网络究竟是个什么玩意&#xff0c;它是如何工作的呢&#xf…

MinIO集群模式信息泄露漏洞(CVE-2023-28432)

前言&#xff1a;MinIO是一个用Golang开发的基于Apache License v2.0开源协议的对象存储服务。虽然轻量&#xff0c;却拥有着不错的性能。它兼容亚马逊S3云存储服务接口&#xff0c;非常适合于存储大容量非结构化的数据。该漏洞会在前台泄露用户的账户和密码。 0x00 环境配置 …

数字信封技术概论

数字信封技术是一种通过加密手段实现信息保密性和验证的技术&#xff0c;它在保护敏感信息传输过程中得到了广泛应用。本文将详细介绍数字信封技术的原理、实现和应用场景。 一、数字信封技术的原理 数字信封技术是一种将对称密钥通过非对称加密手段分发的方法。在数字信封中…

《C++设计模式》——行为型

前言 行为型模式是对在不同的对象之间划分责任和算法的抽象化。行为型模式不仅仅关注类和对象的结构&#xff0c;而且重点关注它们之间的相互作用。 Interpreter(解释器) Template Method(模板方法) Chain of Responsibility(责任链) Command(命令) Iterator(迭代器) Me…

海康NVR(Network Video Recorder)启用SSH过程摸索

文章目录 海康NVR具备的特点启用SSH模式优劣比较启用SSH模式的优势启用SSH模式的坏处 Hik NVR启用SSH功能1&#xff0c;Web登录NVR2&#xff0c;SSH登录NVR SSH shell模式特点SSH shell模式指令作用1&#xff0c;简要帮助“help”可以列出常用的shell指令部分可用shell指令输出…

实现一台电脑登录多个微信账号/一个微信账号在多台电脑登录

一、一台电脑登录多个微信账号 在电脑桌面建立一个txt文档文件。 输入内容: echo off start /d"C:\Program Files\Tencent\WeChat\" WeChat.exe start /d"C:\Program Files\Tencent\WeChat\" WeChat.exe exit 如下图&#xff0c;/d"引号内容写微信安…

KT142C-sop16语音芯片ic的串口指令详细说明_默认9600指令可设

3.1 通讯格式 支持异步串口通讯模式,通过串口接受上位机发送的命令 通讯标准:9600 bps --- 可以发送指令修改&#xff0c;并且记忆&#xff0c;详见3.4.5 数据位 :8 停止位 :1 校验位 :none 流控制 :none 格式&#xff1a;$S VER Len CMD Feedback para1 …

简单便捷的行为验证码,让登录更轻松

前言 在当今数字化的世界里&#xff0c;登录账户已成为我们日常生活中不可或缺的一部分。然而&#xff0c;传统的输入验证码方式却常常给用户带来不必要的繁琐和麻烦。为了解决这一问题&#xff0c;简单便捷的行为验证码应运而生&#xff0c;让登录变得更加轻松。 行为验证码…

TuyaOS Sensor Hub组件介绍

文章目录 Sensor Hub 设计思想分层设计Sensor Hub 层(tdl)Sensor Driver 层(tdd) 传感数据元素类型抽象传感器采集策略 Sensor Hub 对上数据与接口数据结构1. 数据读取的触发模式2. 元素型数据订阅规则3. 数据就绪通知回调4. 传感设备信息 应用接口1. 创建传感器实例2. 启动传感…

vue3路由跳转params传参接收不到

import { useRouter } from "vue-router";const router useRouter(); // 提现记录 const withdrawalClick (item) > {router.push({ name: "Devwithdrawal", params: { name: 123 } }); };//跳转页面接收参数 import { useRoute } from "vue-rou…

指针和字符数组笔试题及其解析(第二组)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; 数组名在寻常情况下表示首元素地址&#xff0c;但有两种情况例外&#xff1a; 1.sizeof(数组名)&#xff0c;这里的数组名表示整个数组&#xff0c;计算的是整个数组的大小 2.&数组名&#xff0c;这里的…

OLED透明屏模块:引领未来显示技术的突破

OLED透明屏模块作为一项引领未来显示技术的突破&#xff0c;以其独特的特点和卓越的画质在市场上引起了广泛关注。 根据行业报告&#xff0c;预计到2025年&#xff0c;OLED透明屏模块将占据智能手机市场的20%份额&#xff0c;并在汽车导航系统市场中占据30%以上份额。 那么&am…

TD3算法

TD3算法 全称Twin Delayed DDPG&#xff0c;是对DDPG算法的继承、发展和改进&#xff0c;论文 改进如下&#xff1a; T w i n \mathcal{T}win Twin&#xff1a;使用了两个critic来评估actor的动作价值&#xff0c;对应两个critic target&#xff0c;一个actor target&#xff0…

[漏洞复现] metinfo_6.0.0_file-read(任意文件读取)

文章目录 漏洞描述漏洞等级影响版本漏洞复现基础环境漏洞点第一次测试第二次测试第三次测试第四次测试深度利用EXP编写EXP使用案例漏洞挖掘指纹信息修复建议 本次漏洞复现仅供学习使用&#xff0c;如若非法他用&#xff0c;与平台和本文作者无关&#xff0c;需自行负责&#xf…

Solidity 小白教程:10. 控制流,用 solidity 实现插入排序

Solidity 小白教程&#xff1a;10. 控制流&#xff0c;用 solidity 实现插入排序 这一讲&#xff0c;我们将介绍solidity中的控制流&#xff0c;然后讲如何用solidity实现插入排序&#xff08;InsertionSort&#xff09;&#xff0c;一个看起来简单&#xff0c;但实际上很容易…

系统架构设计师(第二版)学习笔记----计算机系统基础

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----计算机系统基础 文章目录 一、计算机硬件1.1 计算机硬件的组成1.2 处理器指令集1.3 处理器层次1.4 总线分类1.5 接口的种类 二、计算机操作系统2.1 计算机软件分类2.2 操作系统的作用2.3 操作系统的特征2…

【FusionInsight 迁移】HBase从C50迁移到6.5.1(01)迁移概述

【FusionInsight 迁移】HBase从C50迁移到6.5.1&#xff08;01&#xff09;迁移概述 HBase从C50迁移到6.5.1&#xff08;01&#xff09;迁移概述迁移范围迁移前的准备HDFS文件检查确认HBase迁移目录确保数据落盘停止老集群HBase服务停止新集群HBase服务 HBase从C50迁移到6.5.1&a…

L1-063 吃鱼还是吃肉(Python实现) 测试点全过

前言&#xff1a; {\color{Blue}前言&#xff1a;} 前言&#xff1a; 本系列题使用的是&#xff0c;“PTA中的团体程序设计天梯赛——练习集”的题库&#xff0c;难度有L1、L2、L3三个等级&#xff0c;分别对应团体程序设计天梯赛的三个难度。更新取决于题目的难度&#xff0c;…