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

news2024/7/6 20:01:02

在这里插入图片描述

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

第1题:道路

N个以 1 … N 标号的城市通过单向的道路相连:。每条道路包含两个参数:道路的长度和需要为该路付的通行费(以金币的数目来表示)
Bob and Alice 过去住在城市 1.在注意到Alice在他们过去喜欢玩的纸牌游戏中作弊后,Bob和她分手了,并且决定搬到城市N。他希望能够尽可能快的到那,但是他囊中羞涩。我们希望能够帮助Bob找到从1到N最短的路径,前提是他能够付的起通行费。
时间限制:1000
内存限制:65536
输入
第一行包含一个整数K, 0 <= K <= 10000, 代表Bob能够在他路上花费的最大的金币数。第二行包含整数N, 2 <= N <= 100, 指城市的数目。第三行包含整数R, 1 <= R <= 10000, 指路的数目. 接下来的R行,每行具体指定几个整数S, D, L 和 T来说明关于道路的一些情况,这些整数之间通过空格间隔: S is 道路起始城市, 1 <= S <= N D is 道路终点城市, 1 <= D <= N L is 道路长度, 1 <= L <= 100 T is 通行费 (以金币数量形式度量), 0 <= T <=100 注意不同的道路可能有相同的起点和终点。
输出
输入结果应该只包括一行,即从城市1到城市N所需要的最小的路径长度(花费不能超过K个金币)。如果这样的路径不存在,结果应该输出-1。
样例输入
5
6
7
1 2 2 3
2 4 3 3
3 4 2 4
1 3 4 1
4 6 2 1
3 5 2 0
5 4 3 2
样例输出
11

以下是一个求解最短路径问题的C语言解决方案:

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

#define MAX_CITIES 100
#define MAX_ROADS 100

typedef struct {
    int destination;
    int length;
    int toll;
} Road;

typedef struct {
    int city;
    int cost;
} Node;

int dijkstra(int start, int end, int max_cost, int num_cities, Road roads[]) {
    int distances[MAX_CITIES + 1];
    bool visited[MAX_CITIES + 1];

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

    distances[start] = 0;

    while (true) {
        int min_distance = INT_MAX;
        int current_city = -1;

        for (int i = 1; i <= num_cities; i++) {
            if (!visited[i] && distances[i] < min_distance) {
                min_distance = distances[i];
                current_city = i;
            }
        }

        if (current_city == -1 || current_city == end) {
            break;
        }

        visited[current_city] = true;

        for (int i = 0; i < num_cities; i++) {
            Road road = roads[i];
            if (road.destination == current_city && road.toll <= max_cost) {
                int new_distance = distances[current_city] + road.length;
                if (new_distance < distances[road.destination]) {
                    distances[road.destination] = new_distance;
                }
            }
        }
    }

    return distances[end] == INT_MAX ? -1 : distances[end];
}

int main() {
    int max_cost, num_cities, num_roads;
    scanf("%d %d %d", &max_cost, &num_cities, &num_roads);

    Road roads[MAX_ROADS];

    for (int i = 0; i < num_roads; i++) {
        int start, end, length, toll;
        scanf("%d %d %d %d", &start, &end, &length, &toll);
        Road road = {end, length, toll};
        roads[i] = road;
    }

    int shortest_distance = dijkstra(1, num_cities, max_cost, num_cities, roads);

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

    return 0;
}

在这个解决方案中,我们使用Dijkstra算法来求解最短路径。首先定义了两个结构体RoadNodeRoad结构体表示一条道路,包含目的地城市、长度和通行费。Node结构体表示Dijkstra算法中的节点,包含城市和到达该城市的花费。

然后,我们实现了dijkstra函数来执行Dijkstra算法。该函数接收起始城市、终点城市、最大金币数、城市数量和道路数组作为参数。在函数中,我们使用distances数组来记录起始城市到每个城市的最短距离,并使用visited数组来标记已访问的城市。

在主函数中,我们根据输入读取最大金币数、城市数量和道路数量,并读取每条道路的起始城市、终点城市、长度和通行费。然后,我们调用dijkstra函数,并输出最短路径的长度。

需要注意的是,如果最短路径不存在,则输出-1。

综上所述,这个C语言解决方案可以帮助Bob找到从城市1到城市N的最短路径,并确保路径上的花费不超过他能够承受的金币数。

第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>
#include <stdbool.h>

#define MAX_COMPANIES 100

bool isControlled[MAX_COMPANIES + 1][MAX_COMPANIES + 1];

void updateControl(int i, int j, int p, int num_companies) {
    if (p >= 50) {
        isControlled[i][j] = true;
    }

    for (int k = 1; k <= num_companies; k++) {
        if (isControlled[j][k]) {
            isControlled[i][k] = true;
        }
    }
}

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

    int i, j, p;
    int num_companies = 0;

    for (int k = 0; k < num_pairs; k++) {
        scanf("%d %d %d", &i, &j, &p);
        updateControl(i, j, p, num_companies);
        num_companies = (i > num_companies) ? i : num_companies;
        num_companies = (j > num_companies) ? j : num_companies;
    }

    for (int h = 1; h <= num_companies; h++) {
        for (int s = 1; s <= num_companies; s++) {
            if (h != s && isControlled[h][s]) {
                printf("%d %d\n", h, s);
            }
        }
    }

    return 0;
}

在这个解决方案中,我们使用一个布尔型的二维数组isControlled来记录公司之间的控制关系。数组的行表示控制的公司,列表示被控制的公司。如果isControlled[i][j]true,则表示公司i控制公司j。

我们定义了一个updateControl函数来更新控制关系。该函数接收三个参数:i、j和p,表示公司i拥有公司j的p%的股票。函数根据控制条件更新isControlled数组。

在主函数中,我们首先读取三对数的数量,并定义了变量num_companies来记录公司的数量。

然后,我们使用一个循环读取每个三对数,并调用updateControl函数来更新控制关系。同时,我们通过比较i和j的大小来更新num_companies的值,确保其为最大公司的编号。

最后,我们遍历isControlled数组,输出所有控制其他公司的公司的编号对。

需要注意的是,我们不输出控制自己的公司。

综上所述,这个C语言程序可以帮助找出所有控制其他公司的公司,并输出它们的编号对。

第3题:发现它,抓住它

一个城市中有两个犯罪团伙A和B,你需要帮助警察判断任意两起案件是否是同一个犯罪团伙所为,警察所获得的信息是有限的。假设现在有N起案件(N<=100000),编号为1到N,每起案件由团伙A或团伙B所为。你将按时间顺序获得M条信息(M<=100000),这些信息分为两类:
D [a] [b]
其中[a]和[b]表示两起案件的编号,这条信息表明它们属于不同的团伙所为
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>
#include <stdbool.h>

#define MAX_CASES 100000

int parent[MAX_CASES + 1];

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

void unionSets(int x, int y) {
    int parentX = find(x);
    int parentY = find(y);
    parent[parentX] = parentY;
}

bool areSameGang(int x, int y) {
    return find(x) == find(y);
}

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

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

        for (int i = 1; i <= N; i++) {
            parent[i] = i;
        }

        char type;
        int a, b;

        while (M--) {
            scanf(" %c %d %d", &type, &a, &b);

            if (type == 'A') {
                if (areSameGang(a, b)) {
                    printf("In the same gang.\n");
                } else {
                    printf("In different gangs.\n");
                }
            } else if (type == 'D') {
                unionSets(a, b);
            }
        }
    }

    return 0;
}

在这个解决方案中,我们使用并查集来判断案件是否属于同一个犯罪团伙。我们使用一个数组parent来记录每个案件所属的团伙,初始时每个案件的团伙编号为其自身。

我们定义了find函数来查找案件所属的团伙编号。如果案件的团伙编号与其自身相同,则表示找到了根节点,即最终的团伙编号。否则,递归调用find函数继续查找。

我们还定义了unionSets函数来合并两个团伙。该函数接收两个案件的编号,找到它们所属的团伙编号,并将其中一个团伙的根节点的父节点设置为另一个团伙的根节点,实现合并。

在主函数中,我们首先读取测试数据的数量T,并使用一个循环处理每组测试数据。

对于每组测试数据,我们首先读取案件的数量N和信息的数量M,并初始化parent数组。

然后,我们使用一个循环读取每条信息,并根据信息的类型进行相应的操作。如果是"A"类型的信息,我们调用areSameGang函数判断两起案件是否属于同一个团伙,并输出相应的答案。如果是"D"类型的信息,我们调用unionSets函数合并两个团伙。

综上所述,这个C语言程序可以根据接收到的信息判断任意两起案件是否是同一个犯罪团伙所为,并输出相应的答案。

第4题:青蛙的约会

两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面。它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止。可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置。不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的。但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的。为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面。 我们把这两只青蛙分别叫做青蛙A和青蛙B,并且规定纬度线上东经0度处为原点,由东往西为正方向,单位长度1米,这样我们就得到了一条首尾相接的数轴。设青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。
时间限制:1000
内存限制:65536
输入
输入只包括一行5个整数x,y,m,n,L,其中x≠y < 2000000000,0 < m、n < 2000000000,0 < L < 2100000000。
输出
输出碰面所需要的跳跃次数,如果永远不可能碰面则输出一行"Impossible"
样例输入
1 2 3 4 5
样例输出
4

以下是一个解决青蛙约会问题的C语言程序:

#include <stdio.h>

unsigned long long gcd(unsigned long long a, unsigned long long b) {
    if (b == 0) {
        return a;
    }
    return gcd(b, a % b);
}

int main() {
    unsigned long long x, y, m, n, L;
    scanf("%llu %llu %llu %llu %llu", &x, &y, &m, &n, &L);

    unsigned long long distance = (y - x + L) % L;
    unsigned long long commonJump = gcd(m, n);

    if (distance % commonJump != 0) {
        printf("Impossible\n");
    } else {
        unsigned long long jumps = (L / commonJump) - (distance / commonJump);
        printf("%llu\n", jumps);
    }

    return 0;
}

在这个解决方案中,我们首先定义了一个函数gcd来计算两个数的最大公约数,采用辗转相除法。

在主函数中,我们首先读取输入的青蛙的初始位置x和y,每次跳跃的距离m和n,以及纬度线的总长度L。

然后,我们计算出距离distance,即青蛙B相对于青蛙A的位置。由于纬度线是首尾相接的数轴,我们使用(y - x + L) % L来确保距离始终为正数。

接下来,我们计算出两只青蛙能够同时到达的最小公倍数commonJump。这个公倍数表示两只青蛙需要跳多少次才能同时到达同一位置。

如果distance不能整除commonJump,说明两只青蛙永远不可能碰面,输出"Impossible"。

否则,我们计算出需要的跳跃次数jumps,通过(L / commonJump) - (distance / commonJump)计算得到。其中,(L / commonJump)表示纬度线上的周期数,(distance / commonJump)表示已经跳过的周期数。

最后,我们输出计算得到的跳跃次数jumps。

综上所述,这个C语言程序可以根据输入的青蛙的初始位置和跳跃距离,计算出它们跳了几次以后才会碰面,或者判断永远不可能碰面。

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

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

相关文章

msvcr120.dll找不到是什么原因

今天&#xff0c;我将为大家分享关于电脑msvcr120.dll丢失的6种不同解决方法。希望这些方法能够帮助到正在面临这个问题的朋友们。 首先&#xff0c;让我们来了解一下msvcr120.dll是什么文件。msvcr120.dll是Microsoft Visual C 2012 Redistributable Package的一个组件&#x…

CMA和CNAS的区别?

测试资质 一、定义不同CMA&#xff1a;即实验室资质认定&#xff0c;也称为计量认证。它是根据《中华人民共和国计量法》、《中华人民共和国认证认可条例》等有关法律法规&#xff0c;对向社会提供公证数据的检验机构进行强制性检查的一种方式&#xff0c;是政府对第三方实验室…

浏览器中怎样查看前后端传值

路径&#xff1a;F12–>Network -->Fetch/XHR,选择一个接口地址。 在payload里面是前端发送给后端的参数。也即客户端发送给服务端的请求数据&#xff0c;即接口地址入参。 Preview和Response里都是后端返回给前端的。Preview是格式化过的&#xff0c;比较容易看。Resp…

Seata 解决分布式事务理论与实践

文章目录 1.分布式事务问题1.1.本地事务1.2.分布式事务1.3.演示分布式事务问题 2.理论基础2.1.CAP定理2.2.BASE理论2.3.解决分布式事务的思路 3.初识Seata3.1.Seata的架构3.2.部署TC服务3.3.微服务集成Seata3.3.1.引入依赖3.3.2.配置TC地址3.3.3.其它服务 4.动手实践4.1.XA模式…

合并两个有序链表(每日一题)

“路虽远&#xff0c;行则将至” ❤️主页&#xff1a;小赛毛 ☕今日份刷题&#xff1a;合并两个有序链表 题目描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例1&#xff1a; 输入&#xff1a;l1 …

GeoServe Web 管理界面 实现远程访问

文章目录 前言1.安装GeoServer2. windows 安装 cpolar3. 创建公网访问地址4. 公网访问Geo Servcer服务5. 固定公网HTTP地址 前言 GeoServer是OGC Web服务器规范的J2EE实现&#xff0c;利用GeoServer可以方便地发布地图数据&#xff0c;允许用户对要素数据进行更新、删除、插入…

系统错误码指示确立+日志模块手动配置

1&#xff0c;系统错误码指示确立 对于前后端分离的系统设计中&#xff0c;后端建立错误码指示对于前端非常重要可以指示错误存在地方&#xff1b;以用户注册为例&#xff1b; public interface SystemCode{int SYSTEM_USER_ERROR_ADD_FAIL 10000;int SYSTEM_USER_INFO_ADD …

C#,《小白学程序》第十四课:随机数(Random)第一,几种随机数的计算方法与代码

1 文本格式 /// <summary> /// 《小白学程序》第十四课&#xff1a;随机数&#xff08;Random&#xff09;第一&#xff0c;几种随机数的计算方法与代码 /// 本课初步接触一下随机数。 /// </summary> /// <param name"sender"></param> ///…

《TCP/IP网络编程》阅读笔记--地址族和数据序列

目录 1--IP地址和端口号 2--地址信息的表示 3--网络字节序与地址变换 4--网络地址的初始化与分配 5--Windows部分代码案例 1--IP地址和端口号 IP 地址分为两类&#xff1a; ① IPv4 表示 4 字节地址族&#xff1b; ② IPv6 表示 16 字节地址族&#xff1b; IPv4 标准的 4 …

Svelte状态管理——svelte/store模块的使用

目录 前言 一、项目中使用示例 1. 创建全局状态 2. 在组件中使用全局状态 3. 便捷使用技巧$ 二、api介绍 1. writable 2. readable 3. derived 前言 在 Svelte 中&#xff0c;可以使用其自带的svelte/store模块来管理全局的应用程序状态&#xff0c;该模块导出用于创…

大出所料,9月1号前上线的小游戏却收到了补充备案材料的通知

引言 前阵子工信部发布了《工业和信息化部关于开展移动互联网应用程序备案工作的通知》&#xff0c;为此&#xff0c;微信公众平台ICP代备案管理系统提供新增备案、变更备案、注销备案等服务&#xff0c;协助开发者更好更方便地完成微信小程序备案&#xff0c;届时所有9月1号后…

HTML 标签讲解

HTML 标签讲解 HTML 语言结构根元素元数据元素主体根元素大纲元素文本内容语义化内联文本图像与多媒体编辑标识table表格内容表单内容table表单 HTML 语言结构 Markup &#xff08;标记、标签&#xff09;用来容纳和描述内容 严格意义上&#xff0c;标签是指开始标签&#xf…

PMC在制造企业中发挥哪些价值?

导 读 ( 文/ 2127 ) PMC(生产计划与物料控制)是制造企业运行的核心&#xff0c;PMC的好坏可以直接影响客户的需求交付、生产进行的顺利与否、库存资金的占用、企业效率的提升等&#xff0c;在制造企业中起着关键的作用。它负责将生产计划转化为实际的生产活动&#xff0c;并确保…

Mavan进阶之多模块(聚合)

文章目录 Maven 多模块&#xff08;聚合&#xff09;非父子关系的多模块项目 Maven 多模块&#xff08;聚合&#xff09; Maven 继承和聚合是 2 个独立的概念。工程与工程之间可能毫无关系&#xff0c;也可能是继承关系&#xff0c;也可能是聚合关系&#xff0c;也可能既是继承…

QT数据库,实现数据库增删改查

QT关于数据库的相关概念 QT将数据库分为三个层次&#xff1a; 数据库驱动层&#xff1a;QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase、QSqlDriverPlugin sql接口层&#xff1a;QSqlDatabase、QSqlQuery、QSqlRecord、QSqlError 用户接口层&#xff1a;提供一些模…

算法训练 第一周

一、合并两个有序数组 本题给出了两个整数数组nums1和nums2&#xff0c;这两个数组均是非递减排列&#xff0c;要求我们将这两个数组合并成一个非递减排列的数组。题目中还要求我们把合并完的数组存储在nums1中&#xff0c;并且为了存储两个数组中全部的数据&#xff0c;nums1中…

创建具有管理员权限的快捷方式

参考 https://zhidao.baidu.com/question/86334639.html

【AI】机器学习——绪论

文章目录 1.1 机器学习概念1.1.1 定义统计机器学习与数据挖掘区别机器学习前提 1.1.2 术语1.1.3 特点以数据为研究对象目标方法——基于数据构建模型SML三要素SML步骤 1.2 分类1.2.1 参数化/非参数化方法1.2.2 按算法分类1.2.3 按模型分类概率模型非概率模型逻辑斯蒂回归 1.2.4…

CRM 自动化如何改善销售和客户服务?

许多 B2B 和 B2C 公司都使用 CRM 系统来组织业务流程&#xff0c;使复杂的任务更容易完成。企业可以使用 CRM 自动化来自动化工作流程&#xff0c;让团队有更多的时间来执行高价值的任务&#xff0c;而不是陷于一堆琐碎事情中。 什么是CRM自动化&#xff1f; CRM 自动化是指 C…

SD卡中了蠕虫病毒怎么办?清除病毒以及数据恢复方法

蠕虫病毒是近年来非常流行的病毒之一&#xff0c;它主要通过U盘、网络等途径进行传播。如果你的SD卡不幸感染了蠕虫病毒&#xff0c;可能会导致数据丢失。那么&#xff0c;如何进行数据恢复呢&#xff1f;同时&#xff0c;当SD卡中感染了蠕虫病毒时&#xff0c;我们应该采取什么…