【筆試記錄】華為 | 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.pswp.cn/web/37550.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37550.shtml
英文地址,請注明出處:http://en.pswp.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,…