【笔试记录】华为 | 20230823 | cpp

获取连通的相邻节点列表

题目描述

在网元内,存在了 N 个转发节点,每个转发节点有自己唯一的标识 TB 且每个节点有 M 个端口,节点间通过端口进行报文通讯。出于业务隔离的需求,服务器内的端口被划分为多个通讯平面(用 VLAN 隔离,每个 VLAN 都有一个 VLAN ID作为标识)

  1. 如果两个端口的VLAN ID相同,则说明这两个端口处于同个 VLAN,且处于连通状态;
  2. 如果两个端口的VLAN ID不同,则说明这两个端口处于不同 VLAN,彼此不连通;

现给出节点 A 的端口数及其各端口所属的 VLAN ID,以及节点 A 相邻的其他节点和端口信息。 要求获取与节点 A 处于连通状态的所有相邻节点的 TB 列表(按 TB 从小到大顺序输出)

输入描述
第 1 行: M VLAN_ID_1…VLAN_ID_m 数据间有空格隔开,分别表示: 节点 A 有 M 个端口,各个端口所属的 VLAN_ID,即后面 VLAN_ID_m 表示第 m 个端口的 VLAN ID。

其中,网元内节点的端口数量 M 的取值范围为[1,4]; 端口划分 VLAN ID 的取值范围为[1,4];

第 2 行: N 表示与节点 A 相邻的其他节点有 N 个,N 的取值范围为[0,4000)

第 3 行开始,将有 N 行数据,分别描述与节点 A 相邻的节点的 TB 和端口信息

输入格式为: TBx Mx VLAN_ID_xx…VLAN_ID_xm 数据间有空格隔开,

分别表示: 节点 x 的 TBx,有 Mx 个端口,各个端口所属的 VLAN_ID,即后面 VLAN_ID_xm 表示第 m 个端口的 VLAN ID。 其中,网元内节点 TB 的取值范围为(0,4294967295);

输出描述
第 1 行: N

表示与节点 A 连通的相邻节点个数,如 N 为 0,则无需在输出其他信息

第 2 行: TB_1…TB_n

数据间有空格隔开,分别表示:与节点 A 连通的相邻节点的 TB,个数为 N,按从小到大的顺序输出。

输入示例

1 1
3
1024 2 1 2
1023 1 1
1025 3 2 2 3

输出示例

2
1023 1024

提示信息
节点 A 有 1 个端口,VLAN ID 为 1。

相邻的 3 个节点中:

节点 1024 有 2 个端口,其中一个端口的 VLAN ID 为 1,与节点 A 连通。

节点 1023 有 1 个端口,VLAN ID 为 1,与节点 A 连通。

节点 1025 的端口 VLAN ID 分别为 2, 2, 3,没有与节点 A 相同的 VLAN ID,不连通。

最终输出连通的 2 个相邻节点 1023 和 1024,按 TB 从小到大排序。

cpp代码

真的是读题半小时,做题五分钟。。。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;#define MAX 4000
int M;  // 节点A端口数量
int A_VLAN[4];  // 节点A的VLAN ID
int N;  // 节点A相邻节点数量
int N_VLAN[MAX][6];  // 相邻节点的信息
vector<int> result;int main() {// 读取节点A的端口数量和VLAN IDcin >> M;for(int i = 0; i < M; i++) {cin >> A_VLAN[i];}// 读取相邻节点的数量cin >> N;// 读取每个相邻节点的TB、端口数量和VLAN IDfor(int i = 0; i < N; i++) {cin >> N_VLAN[i][0] >> N_VLAN[i][1];  // TB和Mxbool isConnected = false;  // 标志是否连通for(int j = 0; j < N_VLAN[i][1]; j++) {cin >> N_VLAN[i][j + 2];  // 读取VLAN IDif(!isConnected){// 检查是否有相同的VLAN IDfor(int k = 0; k < M; k++) {if(N_VLAN[i][j + 2] == A_VLAN[k]) {isConnected = true;break;}}}}// 如果连通,将TB添加到结果中if(isConnected) {result.push_back(N_VLAN[i][0]);}}// 对结果进行排序sort(result.begin(), result.end());// 输出结果cout << result.size() << endl;for(int i = 0; i < result.size(); i++) {cout << result[i];if(i != result.size() - 1) cout << " ";}return 0;
}

消息传输

题目描述

在给定的 m x n (1 <= m, n <= 1000) 网格地图 grid 中,分布着一些信号塔,用于区域间通信。

每个单元格可以有以下三种状态:

  • 值 0 代表空地,无法传递信号;
  • 值 1 代表信号塔 A,在收到消息后,信号塔 A 可以在 1ms 后将信号发送给上下左右四个方向的信号塔;
  • 值 2 代表信号塔 B,在收到消息后,信号塔 B 可以在 2ms 后将信号发送给上下左右四个方向的信号塔。

给定一个坐标 (j, k),输入保证坐标 (j, k) 位置一定有信号塔。在坐标 (j, k) 位置的信号塔触发一个信号。

要求返回网格地图中所有信号塔收到信号的最短时间,单位为 ms。如果有信号塔无法收到信号,则返回 -1。

输入描述
第一行:网格的列数 n。

第二行:网格的行数 m。

第三行:触发信号的信号塔坐标 (j, k)。

接下来的 m 行:每行包含 n 个整数,表示该行网格中每个位置的信号塔安装信息(通过空格间隔每个状态值)。

输出描述
输出返回 网格地图中所有信号塔收到信号的最小时间,单位为ms。如果不可能,返回-1。

输入示例

3
3
1 0
0 1 2
1 2 1
0 1 2

输出示例

4

初始答案

感觉这题和京东的皇后移动的最小步数,所以我首要考虑了BFS。

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define N 1004
#define pi pair<int, int>
int m, n;   // 网格行数,列数
int j, k;   // 触发信号的信号塔(j, k)
int grid[N][N];
int dx[4] = { -1, 1, 0, 0 }; // 上下左右
int dy[4] = { 0, 0, -1, 1 }; // 上下左右int main() {cin >> n >> m;cin >> j >> k;for (int r = 0; r < m; r++) {for (int c = 0; c < n; c++) {cin >> grid[r][c];}}// 特殊情况:只有一行if (m <= 1){for(int i = 0; i < n; i++){if(i < k && i < n-1 && grid[0][i] != 0 && grid[0][i+1] == 0){cout << -1 << endl; return 0;}if(i > k && i >= 1 && grid[0][i] != 0 && grid[0][i-1] == 0){cout << -1 << endl; return 0;}}}// 特殊情况:只有一列if (n <= 1){for(int i = 0; i < m; i++){if(i < j && i < m-1 && grid[i][0] != 0 && grid[i+1][0] == 0){cout << -1 << endl; return 0;}if(i > j && i >= 1 && grid[i][0] != 0 && grid[i-1][0] == 0){cout << -1 << endl; return 0;}}}vector<vector<int>> ttime(m, vector<int>(n, -1));int max_time = -1;vector<vector<int>> visited(m, vector<int>(n, 0));queue<pi> q;  // 队列存放当前信号塔发射信号能够收到的信号塔indexq.push(pi(j, k));visited[j][k] = 1;  // 因为是从(j, k)开始的,所以要设置已访问 ttime[j][k] = 0;while (!q.empty()) {pi cur = q.front();q.pop();int cur_x = cur.first;int cur_y = cur.second;// cout << "cur: " << cur_x << ", " << cur_y << "\n";// 上下左右四种情况分别看看 for (int i = 0; i < 4; i++) {int q_x = cur_x + dx[i];int q_y = cur_y + dy[i];// cout << "ques: " << q_x << ", " << q_y << " ";// 如果此处没有信号塔,或被访问过,或索引超出范围,就continue if (q_x < 0 || q_x >= m || q_y < 0 || q_y >= n || grid[q_x][q_y] == 0 || visited[q_x][q_y] == 1) {// cout << "continue" << endl;continue;}// 将(q_x, q_y)处标记为已访问visited[q_x][q_y] = 1;// 计算从(cur_x, cur_y)发送信号到(q_x, q_y)的时间(并加上之前的时间) ttime[q_x][q_y] = ttime[cur_x][cur_y] + grid[cur_x][cur_y];max_time = max(max_time, ttime[q_x][q_y]);// cout << "time: " << time[q_x][q_y] << " max_time: " << max_time << endl;q.push(pi(q_x, q_y));}}for (int r = 0; r < m; r++) {for (int c = 0; c < n; c++) {if (grid[r][c] != 0 && ttime[r][c] == -1) {cout << -1 << endl;return 0;}}}cout << max_time << endl;return 0;
}

但是这个代码在运行下面这个案例时出现了wrong answer:

运行时间:
85ms
消耗内存:
6780kb
========[test2.in]=========
21
5
3 14
2 1 1 1 2 2 0 2 1 1 0 0 1 1 1 2 2 1 1 1 1
2 1 2 1 1 2 0 2 2 2 2 1 1 2 2 1 2 1 1 1 1
0 1 1 0 2 1 2 1 2 0 1 1 1 2 1 1 0 0 0 2 1
2 1 2 1 1 1 1 0 1 1 1 1 0 2 2 1 2 2 1 2 1
0 2 1 1 2 2 1 0 2 1 2 2 0 1 2 2 1 0 1 2 2========[test2.out]=========
Expected						      |	Yours
24							      |	30

后续改进

实在想不出来哪里错了,于是问了chatgpt,有了以下回答:

分析你的代码,发现问题出现在传递时间的计算上。你在计算时间时总是直接加上信号塔的时间,而不是根据不同信号塔的不同传递时间来更新时间。因此,存在多次更新时间的情况,导致最终的时间计算错误。

为了修复这个问题,我们需要改进时间的计算方式,并确保每个信号塔只在更短时间内收到信号时才会被更新。

以下是修正后的代码:

#include <iostream>
#include <vector>
#include <queue>
#include <tuple>
using namespace std;#define N 1004
#define pi pair<int, int>
#define ti tuple<int, int, int> // (time, x, y)int m, n;   // 网格行数,列数
int j, k;   // 触发信号的信号塔(j, k)
int grid[N][N];
int dx[4] = { -1, 1, 0, 0 }; // 上下左右
int dy[4] = { 0, 0, -1, 1 }; // 上下左右int main() {cin >> n >> m;cin >> j >> k;for (int r = 0; r < m; r++) {for (int c = 0; c < n; c++) {cin >> grid[r][c];}}vector<vector<int>> ttime(m, vector<int>(n, INT_MAX));int max_time = -1;vector<vector<int>> visited(m, vector<int>(n, 0));priority_queue<ti, vector<ti>, greater<ti>> pq; // 优先队列 (time, x, y)pq.push({0, j, k});ttime[j][k] = 0;while (!pq.empty()) {auto [cur_time, cur_x, cur_y] = pq.top();pq.pop();if (visited[cur_x][cur_y]) continue;visited[cur_x][cur_y] = 1;for (int i = 0; i < 4; i++) {int q_x = cur_x + dx[i];int q_y = cur_y + dy[i];if (q_x < 0 || q_x >= m || q_y < 0 || q_y >= n || grid[q_x][q_y] == 0) {continue;}int new_time = cur_time + (grid[cur_x][cur_y] == 1 ? 1 : 2);if (new_time < ttime[q_x][q_y]) {ttime[q_x][q_y] = new_time;pq.push({new_time, q_x, q_y});max_time = max(max_time, new_time);}}}for (int r = 0; r < m; r++) {for (int c = 0; c < n; c++) {if (grid[r][c] != 0 && ttime[r][c] == INT_MAX) {cout << -1 << endl;return 0;}}}cout << max_time << endl;return 0;
}

直接提交试试,发现居然是正确的。。。[大拇指]

主要改动

  1. 引入优先队列:优先队列用于确保总是处理当前最短时间的信号传递。
  2. 优化时间更新逻辑:只有当新的时间更短时,才会更新信号塔的时间,并将其加入优先队列。确实,我的初始代码更新时间时没有考虑这个,可能会导致原本是更短的时间被更长的时间更新。

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

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

相关文章

取消lfs, 使用原始文件上传的办法

查询当前仓库使用lfs的文件&#xff0c;然后删除 git lfs ls-files 删除lfs文件后&#xff0c;提交commit git add . git commit -m"remove lfs file" 查询本地lfs配置 git config --local --list 重置本地lfs配置 git config --unset filter.lfs.smudgegit co…

从0到1搭建微服务框架

目录 1.技术栈&#xff1a; 2.模块介绍: 3.关键代码讲解 3.1基础公共模块(common)依赖&#xff1a; 3.3授权模块(auth)依赖: 3.4授权模块核心配置类(AuthrizatonConfig): 3.4 SecurityConfig.java 3.5 bootstrap的核心配置文件(其他服务配置类似这个)&#xff1a; 3.6n…

防爆巡检终端在石化工厂安全保障中的应用

防爆巡检终端在石化工厂安全保障中的应用是广泛而关键的&#xff0c;其设计旨在确保在易燃易爆环境中进行安全、有效的巡检工作。以下是防爆巡检终端在石化工厂安全保障中的详细应用描述&#xff1a; 1. 环境监测与预警 防爆巡检终端配备了各种传感器&#xff0c;能够实时监测…

网银U盾多又乱?后悔没早点用USB Server远程连接管理!

一、引言 网银服务已成为企业日常运营中不可或缺的一部分。但随着企业规模的扩大和业务的增多&#xff0c;网银U盾的数量也随之激增&#xff0c;又多又乱&#xff0c;只能频繁插拔、分散管理&#xff0c;不仅效率低下&#xff0c;而且存在严重的安全隐患。 事实上&#xff0…

ADS131A04硬件设计与软件调试

一、IC基本信息 ADS131A0x 双通道或四通道 24 位 128kSPS 同步采样 Δ-Σ ADC •双通道或四通道同步采样差分输入 • 数据速率&#xff1a;高达 128kSPS • 高性能&#xff1a; – 单通道精度&#xff1a;在 10,000:1 动态范围内优于 0.1% – 有效分辨率&#xff1a;20.6位…

SpringCloud-服务网关-Gateway

1.服务网关在微服务中的应用 (1)对外提供服务的难题分析&#xff1a; 微服务架构下的应用系统体系很庞大&#xff0c;光是需要独立部署的基础组件就有注册中心、配置中心和服务总线、Turbine异常聚合和监控大盘、调用链追踪器和链路聚合&#xff0c;还有Kaka和MQ之类的中间件&…

海思NNIE部署yolov5-shufflenet

1.简要说明 由于NNIE上transpose支持的顺序是固定的,shufflenet那种x=torch.transpose(x,1,2).contiguous() 的操作一般是不支持的。需要进行调整。 2.使用工程以及修改 使用的是开源工程:GitHub - Lufei-github/shufflev2-yolov5: shufflev2-yolov5:lighter, faster and ea…

c++应用网络编程之一基本介绍

一、网络编程介绍 c编程的应用场景在前面分析过&#xff0c;一个重要的方向就是网络编程。一般来说&#xff0c;开发者说的服务端编程在c方向上简单的可以认为是网络编程。首先需要说明的&#xff0c;本系列不对网络编程的相关基础知识展开详细的说明&#xff0c;因为这种知识…

玛格家居从深交所转板北交所:营收净利润连年下滑,销售费用大增

《港湾商业观察》施子夫 近日&#xff0c;玛格家居股份有限公司&#xff08;以下简称&#xff0c;玛格家居&#xff09;发布公告&#xff0c;重庆证监局已经受理其北交所上市的备案申请&#xff0c;辅导机构为国泰君安证券。 公开信息显示&#xff0c;2022年1月&#xff0c;玛…

【转】Android静态集成X5内核

项目中的老机器使用webview 无法加载vue3打包的网页&#xff0c;只能用独立的webview内核&#xff0c;采用静态加载x5内核的方式&#xff0c; 以下内容转自简书作者漆先生的博客&#xff0c;仅用作备份记录 之前在项目中在线集成的X5内核&#xff0c;但是效果不好&#xff0c;只…

基于STM32的智能电池管理系统

目录 引言环境准备智能电池管理系统基础代码实现&#xff1a;实现智能电池管理系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统实现4.4 用户界面与数据可视化应用场景&#xff1a;电池管理与优化问题解决方案与优化收尾与总结 1. 引言 智能电池管理系统&#xff08;Ba…

【昇思25天学习打卡营打卡指南-第十三天】ShuffleNet图像分类

ShuffleNet图像分类 ShuffleNet网络介绍 ShuffleNetV1是旷视科技提出的一种计算高效的CNN模型&#xff0c;和MobileNet, SqueezeNet等一样主要应用在移动端&#xff0c;所以模型的设计目标就是利用有限的计算资源来达到最好的模型精度。ShuffleNetV1的设计核心是引入了两种操…

GPT-5 一年半后发布,打开人工智能新世纪

关于GPT-5一年半后发布的消息&#xff0c;这一预测主要基于OpenAI首席技术官Mira Murati的采访和声明。然而&#xff0c;需要明确的是&#xff0c;这个时间点&#xff08;即2025年底或2026年初&#xff09;已经与早期传闻有所不同&#xff0c;显示了OpenAI对产品质量的重视&…

react18.x+播放文本内容

需要调接口将文字传递给后端将文字转换成音频文件&#xff0c;然后播放&#xff0c;同时每次播放不同文本时&#xff0c;当前播放的文本需要暂停&#xff0c;切换到播放新点击的文本 可以设置缓存播放过的音频&#xff0c;也可以不设置缓存&#xff1a; 设置缓存的代码如下&am…

骁龙相机拍照流程分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 1.deliverInputEvent 拍照点击事件处理 2.submitRequestList Camera 提交拍照请求 3.createCaptureRequest 拍照请求帧数 骁龙相机通过binder 数据传输…

idea 内存参数修改不生效问题解决 VM参数设置不生效解决

很多人配置idea 内存参数&#xff0c;怎么配置都不生效&#xff0c;主要原因是配置文件用的不是你修改的那个。 系统环境变量中的这个才是你真正要修改的配置文件。 找到并修改后保存&#xff0c;重启idea就可生效

C++ | Leetcode C++题解之第208题实现Trie(前缀树)

题目&#xff1a; 题解&#xff1a; class Trie { private:vector<Trie*> children;bool isEnd;Trie* searchPrefix(string prefix) {Trie* node this;for (char ch : prefix) {ch - a;if (node->children[ch] nullptr) {return nullptr;}node node->children[…

人工与智能系统之间的交互方式

人工与智能系统之间的交互方式 #mermaid-svg-xSsFZWak2bsyV0un {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-xSsFZWak2bsyV0un .error-icon{fill:#552222;}#mermaid-svg-xSsFZWak2bsyV0un .error-text{fill:#5522…

分词算法在自然语言处理中的基本原理与应用场景

分词算法在自然语言处理中的基本原理与应用场景 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 分词是自然语言处理&#xff08;NLP&#xff09;中的重要基础…

python脚本 限制 外部访问 linux服务器端口

注意&#xff1a;该脚本会清空linux防火墙的filter表的规则和用户自定义链路 脚本的效果是将端口限制为仅服务器内部访问&#xff0c;提高服务的安全性&#xff0c;稳定性 可以提供ip地址白名单 具体脚本&#xff1a; #!/usr/bin/python3 import argparse, subprocess, sys,…