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

news2024/12/25 20:42:40

在这里插入图片描述

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 MAX_POINTS 100

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

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

double shortestPath(Point points[], int n, int connections[][2], int m, int source, int target) {
    double dist[MAX_POINTS];
    int visited[MAX_POINTS] = {0};
    int i, j;

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

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

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

        visited[minIndex] = 1;

        for (j = 0; j < m; j++) {
            int u = connections[j][0];
            int v = connections[j][1];
            double d = distance(points[u], points[v]);

            if (!visited[v] && dist[u] + d < dist[v]) {
                dist[v] = dist[u] + d;
            }
        }
    }

    return dist[target];
}

int main() {
    int n, m;
    Point points[MAX_POINTS];
    int connections[MAX_POINTS][2];
    int source, target;
    int i;

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

    scanf("%d", &m);
    for (i = 0; i < m; i++) {
        scanf("%d %d", &connections[i][0], &connections[i][1]);
    }

    scanf("%d %d", &source, &target);

    double shortestDist = shortestPath(points, n, connections, m, source - 1, target - 1);
    printf("%.2f\n", shortestDist);

    return 0;
}

解释:

首先,我们定义了一个Point结构体来表示点的坐标。

distance()函数用于计算两个点之间的直线距离。

shortestPath()函数实现了Dijkstra算法来找到最短路径的长度。它使用一个距离数组dist来保存每个点到源点的最短距离,visited数组用于标记已经访问过的点。在每一轮迭代中,它选择距离源点最近且未访问过的点作为当前点,然后更新与当前点相邻的点的最短距离。

main()函数中,我们首先读取输入数据,包括点的坐标、连线的信息以及源点和目标点的编号。

然后调用shortestPath()函数来计算最短路径的长度,并打印结果。

第2题:控制公司

有些公司是其他公司的部分拥有者,因为他们获得了其他公司发行的股票的一部分。例如,福特公司拥有马自达公司12%的股票。据说,如果至少满足了以下条件之一,公司A就可以控制公司B了:
l 公司A = 公司B。
l 公司A拥有大于50%的公司B的股票。
l 公司A控制K(K >= 1)个公司,记为C1, …, CK,每个公司Ci拥有xi%的公司B的股票,并且x1+ … + xK > 50%。(ps:A可以控制自己,即Ci可以为A)
你将被给予一系列的三对数(i,j,p),表明公司i拥有公司j的p%的股票。计算所有的数对(h,s),表明公司h控制公司s。
写一个程序读入三对数(i,j,p),并且找出所有的数对(h,s),使得公司h控制公司s。
时间限制:1000
内存限制:65536
输入
第一行: N,表明接下来三对数的数量。 第二行到第N+1行:每行三个整数作为一个三对数(i,j,p),如上文所述。 I,J≤100,N,P≤100
输出
输出零个或更多个的控制其他公司的公司。每行包括两个整数表明序号为第一个整数的公司控制了序号为第二个整数的公司。将输出的每行以第一个数字升序排列(并且第二个数字也升序排列来避免并列)。请不要输出控制自己的公司。
样例输入
3
1 2 80
2 3 80
3 1 20
样例输出
1 2
1 3
2 3

下面是一个使用C语言解决控制公司问题的示例代码:

#include <stdio.h>

#define MAX_COMPANIES 100

int ownership[MAX_COMPANIES][MAX_COMPANIES] = {0};
int controlled[MAX_COMPANIES][MAX_COMPANIES] = {0};
int n;

void dfs(int company, int owner) {
    int i;
    for (i = 0; i < n; i++) {
        if (ownership[company][i] > 0 && controlled[owner][i] == 0) {
            controlled[owner][i] = 1;
            dfs(i, owner);
        }
    }
}

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

    int i, j, p;
    while (n--) {
        scanf("%d %d %d", &i, &j, &p);
        ownership[i - 1][j - 1] = p;
    }

    for (i = 0; i < MAX_COMPANIES; i++) {
        controlled[i][i] = 1;
        for (j = 0; j < MAX_COMPANIES; j++) {
            if (ownership[i][j] > 50) {
                controlled[i][j] = 1;
                dfs(j, i);
            }
        }
    }

    for (i = 0; i < MAX_COMPANIES; i++) {
        for (j = 0; j < MAX_COMPANIES; j++) {
            if (controlled[i][j] && i != j) {
                printf("%d %d\n", i + 1, j + 1);
            }
        }
    }

    return 0;
}

解释:

首先,我们定义了两个二维数组ownershipcontrolled,用于存储公司之间的股权关系和控制关系。

dfs()函数是一个深度优先搜索算法,用于遍历公司之间的股权关系,并更新控制关系。

main()函数中,我们首先从输入中读取公司之间的股权关系,并将其保存在ownership数组中。

然后,使用两个嵌套循环遍历所有公司,如果某个公司拥有超过50%的另一个公司的股权,则将其标记为控制关系,并调用dfs()函数来更新其他受控公司。

最后,我们遍历controlled数组,输出所有的控制关系。

第3题:发现它,抓住它

一个城市中有两个犯罪团伙A和B,你需要帮助警察判断任意两起案件是否是同一个犯罪团伙所为,警察所获得的信息是有限的。假设现在有N起案件(N<=100000),编号为1到N,每起案件由团伙A或团伙B所为。你将按时间顺序获得M条信息(M<=100000),这些信息分为两类:
1、D [a] [b]
其中[a]和[b]表示两起案件的编号,这条信息表明它们属于不同的团伙所为
2、A [a] [b]
其中[a]和[b]表示两起案件的编号,这条信息需要你回答[a]和[b]是否是同一个团伙所为
注意你获得信息的时间是有先后顺序的,在回答的时候只能根据已经接收到的信息做出判断。
时间限制:1000
内存限制:65536
输入
第一行是测试数据的数量T(1<=T<=20)。 每组测试数据的第一行包括两个数N和M,分别表示案件的数量和信息的数量,其后M行表示按时间顺序收到的M条信息。
输出
对于每条需要回答的信息,你需要输出一行答案。如果是同一个团伙所为,回答"In the same gang.“,如果不是,回答"In different gangs.”,如果不确定,回答”Not sure yet."。
样例输入
1
5 5
A 1 2
D 1 2
A 1 2
D 2 4
A 1 4
样例输出
Not sure yet.
In different gangs.
In the same gang.

下面是一个使用C语言解决判断案件团伙问题的示例代码:

#include <stdio.h>

#define MAX_CASES 100000

int gang[MAX_CASES];

int find(int x) {
    if (gang[x] == x)
        return x;
    return gang[x] = find(gang[x]);
}

void merge(int x, int y) {
    int fx = find(x);
    int fy = find(y);
    if (fx != fy)
        gang[fy] = fx;
}

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

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

        // 初始化每个案件所属的团伙
        for (int i = 1; i <= N; i++)
            gang[i] = i;

        char op;
        int a, b;
        while (M--) {
            scanf(" %c %d %d", &op, &a, &b);
            if (op == 'A') {
                // 判断是否属于同一个团伙
                if (find(a) == find(b))
                    printf("In the same gang.\n");
                else
                    printf("In different gangs.\n");
            } else if (op == 'D') {
                // 合并两个团伙
                merge(a, b);
            }
        }
    }

    return 0;
}

解释:

首先,我们定义了一个整数数组gang,用于存储每个案件所属的团伙。

find()函数是一个递归的查找函数,用于找到某个案件所属的团伙的根节点。

merge()函数用于合并两个团伙,将其中一个团伙的根节点指向另一个团伙的根节点。

main()函数中,我们首先读取测试数据的数量T,然后开始处理每组测试数据。

对于每组测试数据,我们首先根据案件数量N初始化每个案件所属的团伙为自身。

然后,依次读取每条信息,并根据信息的类型进行相应的操作。如果是类型为A的信息,我们调用find()函数判断两个案件是否属于同一个团伙;如果是类型为D的信息,我们调用merge()函数合并两个团伙。

最后,根据判断的结果输出相应的答案。

第4题:最短路

给定一个n个点, m条边的有向图, 求从点S出发, 到其它所有点的最短路径.
时间限制:2000
内存限制:65536
输入
第一行一个整数T, 表示有T组数据 对于每组测试数据, 第一行三个整数n, m, S, 表示有n个点, m条边, 起点为S. 接下来m行, 每行三个整数x, y, z, 代表从x到y有长度为z的边 点的编号从1到n T <= 10, n <= 10000, m <= 20000, |z| <= 10000. 所有数据的n之和 <= 30000, 所有数据的m之和 <= 60000.
输出
对于每组数据: 如果从S点出发可以走入负圈 (即到某些点的最短路径可以无限小), 那么输出一行Error. 否则, 输出一行用空格分隔的n个整数, 其中第i个整数表示从S点到i点的最短路长度. 如果从S点无法到达i点, 则第i个输出为”null”.
样例输入
4
5 7 1
1 2 3
2 3 4
3 4 8
1 3 9
4 5 1
1 4 5
1 5 10
4 4 1
1 2 -4
2 3 8
1 3 5
3 4 0
3 3 2
1 2 -3
2 3 -4
3 1 6
4 2 1
1 2 1
3 4 2
样例输出
0 3 7 5 6
0 -4 4 4
Error
0 1 null null

下面是一个使用C语言解决最短路径问题的示例代码,使用Dijkstra算法:

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

#define MAX_NODES 10001
#define MAX_EDGES 60001
#define INF INT_MAX

typedef struct {
    int node;
    int cost;
} Edge;

typedef struct {
    Edge edges[MAX_EDGES];
    int count;
} AdjList;

AdjList graph[MAX_NODES];
int dist[MAX_NODES];

void dijkstra(int start, int n) {
    bool visited[MAX_NODES];
    int i, j;

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

    dist[start] = 0;

    for (i = 1; i <= n; i++) {
        int u = -1;
        for (j = 1; j <= n; j++) {
            if (!visited[j] && (u == -1 || dist[j] < dist[u])) {
                u = j;
            }
        }

        if (dist[u] == INF) {
            break;
        }

        visited[u] = true;

        for (j = 0; j < graph[u].count; j++) {
            int v = graph[u].edges[j].node;
            int cost = graph[u].edges[j].cost;

            if (dist[u] + cost < dist[v]) {
                dist[v] = dist[u] + cost;
            }
        }
    }
}

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

    while (T--) {
        int n, m, S;
        scanf("%d %d %d", &n, &m, &S);

        int i;
        for (i = 1; i <= n; i++) {
            graph[i].count = 0;
        }

        for (i = 0; i < m; i++) {
            int x, y, z;
            scanf("%d %d %d", &x, &y, &z);
            graph[x].edges[graph[x].count].node = y;
            graph[x].edges[graph[x].count].cost = z;
            graph[x].count++;
        }

        dijkstra(S, n);

        for (i = 1; i <= n; i++) {
            if (dist[i] == INF) {
                printf("null ");
            } else {
                printf("%d ", dist[i]);
            }
        }
        printf("\n");
    }

    return 0;
}

解释:

首先,我们定义了一个结构体Edge,用于表示图中的边,包括目标节点和边的权重。

然后,我们定义了一个结构体AdjList,用于表示邻接表,其中包含一个Edge类型的数组以及边的数量。

我们使用邻接表数组graph来表示图,每个节点对应一个邻接表。

dijkstra()函数是一个实现Dijkstra算法的函数,用于计算从起点出发到其他所有点的最短路径。

main()函数中,我们首先读取测试数据的数量T,然后开始处理每组测试数据。

对于每组测试数据,我们首先根据节点数量n初始化图的邻接表。

然后,依次读取每条边的信息,并将其添加到对应节点的邻接表中。

接下来,我们调用dijkstra()函数计算从起点S出发到其他所有点的最短路径。

最后,我们根据最短路径的计算结果输出每个节点的最短路径长度或"null"。

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

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

相关文章

看我为了水作业速通C++!

和java不太一样的一样的标题打个*&#xff0c;方便对比 基本架构* #include<iostream> using namespace std; int main() { system("pause"); return 0; } 打印* cout << "需要打印的内容" <<endl endl 是一个特殊的输出流控…

还在为 Dubbo 服务写 Controller?因为未使用 ShenYu 网关

Dubbo 是一款高性能、轻量级的开源 Java RPC 框架&#xff0c;它可以帮助开发人员快速构建分布式服务。在 Dubbo 应用中&#xff0c;我们经常需要提供 HTTP 调用&#xff0c;如供 H5、外部系统等调用。一般的做法是为需要提供 HTTP 调用的服务编写 Controller&#xff0c;但这并…

高校教务系统登录页面JS分析——西安交通大学

高校教务系统密码加密逻辑及JS逆向 本文将介绍高校教务系统的密码加密逻辑以及使用JavaScript进行逆向分析的过程。通过本文&#xff0c;你将了解到密码加密的基本概念、常用加密算法以及如何通过逆向分析来破解密码。 本文仅供交流学习&#xff0c;勿用于非法用途。 一、密码加…

CUDA学习笔记(八)Branch Divergence and Unrolling Loop

Avoiding Branch Divergence 有时&#xff0c;控制流依赖于thread索引。同一个warp中&#xff0c;一个条件分支可能导致很差的性能。通过重新组织数据获取模式可以减少或避免warp divergence&#xff08;该问题的解释请查看warp解析篇&#xff09;。 The Parallel Reduction …

Mybatis-Plus 0基础光速入门代码

目录 1.创建springboot项目 2.引入依赖 3.找到application.properties&#xff0c;把后缀改成yml&#xff08;这种格式的文件有更多优点&#xff09;&#xff0c;在application.yml里面加上下面的配置代码 4.写实体类 5.创建接口继承BaseMapper 6.在启动类中加上注解Mappe…

头脑风暴之约瑟夫环问题

一 问题的引入 约瑟夫问题的源头完全可以命名为“自杀游戏”。本着和谐友爱和追求本质的目的&#xff0c;可以把问题描述如下&#xff1a; 现有n个人围成一桌坐下&#xff0c;编号从1到n&#xff0c;从编号为1的人开始报数。报数也从1开始&#xff0c;报到m人离席&#xff0c…

阶段七-Day01-Spring01

一、Spring框架介绍 1. 介绍 Spring Framework是由Spring团队研发的模块化、轻量级开源框架。其主要目的是为了简化项目开发。 Spring Framework前身是interface21&#xff0c;由Rod Johnson于2002年研发&#xff0c;主要是为了不使用EJB下依然能够构建高质量Java EE项目。E…

Ubuntu下 u2net tensorrt模型部署

TensorRT系列之 Windows10下yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov7 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov6 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov5 tensorrt模型加速…

浅析人脸活体检测技术的功能及几种分类

在日常生活工作中&#xff0c;出现了人脸验证、人脸支付、人脸乘梯、人脸门禁等等常见的应用场景。这说明人脸识别技术已经在门禁安防、金融行业、教育医疗等领域被广泛地应用&#xff0c;人脸识别技术的高速发展与应用同时也出现不少质疑。其中之一就是人脸识别很容易被照片、…

DDOS攻击的有效防护方式有哪些?

DDoS攻击简介&#xff1a; DDoS攻击&#xff0c;即分布式拒绝服务攻击&#xff08;Distributed Denial of Service&#xff09;&#xff0c;是一种网络攻击&#xff0c;旨在通过向目标服务器发送大量恶意请求&#xff0c;使服务器资源耗尽&#xff0c;无法满足合法用户的需求&a…

KubeSphere安装KubeEdge

1. kubesphere安装请参考博客 2. 配置master节点 控制台->平台管理->集群管理->自定义CRD&#xff0c;搜索​​clusterconfiguration​​&#xff0c;查看详情&#xff0c;在资源列表中&#xff0c;点击 ​​ks-installer​​ 右侧的图标&#xff0c;然后选择编辑配…

一文带你彻底弄懂ZGC

1 推荐的文章 1.1 必看 干掉1ms以内的Java垃圾收集器ZGC到底是个什么东西&#xff1f; 1.2 选看 ZGC有什么缺点? 2 疑问【皆来自上面两篇文章】 2.1 什么使得用户线程工作的同时&#xff0c;让垃圾收集器可以回收垃圾-读写屏障 ZGC (Z Garbage Collector) 和读写屏障: …

【瑞吉外卖部分功能补充】

瑞吉外卖部分功能补充 菜品的启售和停售 在浏览器控制台点击对应功能后可以看到前端发送的请求是&#xff1a;http://localhost:9999/dish/status/1?ids1413342036832100354&#xff0c;请求方式为POST。 接收到前端参数后&#xff0c;进行controller层代码补全&#xff0c…

简单说明反射和new的区别和反射的使用代码展示

目录 1.反射的认识 2.反射和new的区别 3.反射的使用代码展示 4.反射优点和缺点 1.反射的认识 反射是Java语言的一种机制&#xff0c;它允许程序在运行时检查和操作类、方法、字段等信息&#xff0c;而不需要提前知道它们的具体定义。通过反射&#xff0c;我们可以在运行时动…

直接插入排序——希尔排序

排序——先写单个——再衍生到整体 单个插入排序——在插入前数组里面的数是有序的&#xff0c;然后来了一个数据&#xff0c;就要用这个数组从后往前和这个数比较&#xff0c; 整体的话就是&#xff0c;end从0开始&#xff0c;循环n-1次 void TnsertSort(int* a,int n) {in…

QML之Repeater 控件使用

Repeater 控件是 重复作用 根据 model中的index 数量进行重复 废话不说 直接看如何用 当model 为数字时 Rectangle{height: 1200width: 500visible: trueanchors.fill: parentColumn{spacing: 20Repeater{model: 10delegate: Rectangle{width: 60height: 20color: index%2 …

VulnHub ch4inrulz: 1.0.1

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏…

【网络编程】应用层——HTTP协议

文章目录 一、HTTP协议简介二、认识URL三、HTTP协议格式1. HTTP请求协议格式2. HTTP响应协议格式 三、构建HTTP请求和响应四、HTTP的方法五、HTTP的状态码六、HTTP常见的Header七、Cookie和Session 一、HTTP协议简介 HTTP 协议 是 Hyper Text Transfer Protocol&#xff08;超文…

苹果ios打包出来的ipa应用APP怎么不能安装?多种安装不上的原因排查

亲爱的同学们&#xff0c;非常高兴能和同学们一起探讨关于苹果应用安装失败的问题。作为一个开发者&#xff0c;我们很可能会遇到这样的情况&#xff1a;开发好一个应用&#xff0c;兴致勃勃地想把它运行到手机上去测试&#xff0c;结果发现安装失败了。而此时&#xff0c;定位…

【2023_10_22计算机热点知识分享】:人工智能

最近计算机领域的热点话题之一是人工智能的发展。人工智能是一种能够模拟人类智能的技术&#xff0c;它可以通过机器学习、深度学习、自然语言处理等技术&#xff0c;实现语音识别、图像识别、自然语言处理等智能化的功能。人工智能技术的发展&#xff0c;正在深刻地改变着人类…