三元組的最小距離

題目鏈接: 三元組最小距離

定義三元組 $(a, b, c)$($a,b,c$ 均為整數)的距離 $D=|a-b|+|b-c|+|c-a|$。

給定 $3$ 個非空整數集合 $S_1, S_2, S_3$,按升序分別存儲在 $3$ 個數組中。

請設計一個盡可能高效的算法,計算并輸出所有可能的三元組 $(a, b, c)$($a \in S_1,b \in S_2,c \in S_3$)中的最小距離。

例如 $S_1=\{-1, 0, 9\}, S_2=\{-25, -10, 10, 11\}, S_3=\{2, 9, 17, 30, 41\}$ 則最小距離為 $2$,相應的三元組為 $(9,10,9)$。

輸入格式

第一行包含三個整數 $l,m,n$,分別表示 $S_1,S_2,S_3$ 的長度。

第二行包含 l 個整數,表示 $S_1$ 中的所有元素。

第三行包含 $m$ 個整數,表示 $S_2$ 中的所有元素。

第四行包含 $n$ 個整數,表示 $S_3$ 中的所有元素。

以上三個數組中的元素都是按升序順序給出的。

輸出格式

輸出三元組的最小距離。

數據范圍

$1 \le l,m,n \le 10^5$,
所有數組元素的取值范圍 $[-10^9,10^9]$。

輸入樣例:
3 4 5
-1 0 9
-25 -10 10 11
2 9 17 30 41
輸出樣例:
2
  • 暴力想法: 枚舉所有可能的答案排列 從小到大 [S1 S2 S3], [S3 S2 S1], [S2, S3, S1], [S1, S3, S2], [S2, S1, S3], [S3, S1, S2], 如果單純暴力復雜度就是O(6n^3) 鐵定過不了,這時候我們可以選擇枚舉中間值屬于哪個素組, 在每個枚舉中我們已經確定了中間的數,那么我們就可以根據這個中間值在另外兩個數組中二分找到符合排列的數,這里又有兩個前后問題,我們還是直接枚舉比較,比如確定中間的數來自于S2,那么答案排列可能是S1,S2,S3, 或者 S3, S2, S1這樣算下來總的時間復雜度O(3nlogn).

  • 代碼


#include<bits/stdc++.h>
using namespace std;const int N = 1e5 + 10;
typedef long long LL;int main()
{int l, n, m; cin >> l >> n >> m;vector<int> a(l), b(n), c(m);for(int i = 0; i < l; i ++) cin >> a[i];for(int i = 0; i < n; i ++) cin >> b[i];for(int i = 0; i < m; i ++) cin >> c[i];// a中元素當中間值LL ans = 1e12;for(auto it : a){//b a cint dexb = upper_bound(b.begin(), b.end(), it) - b.begin();if(dexb != 0) dexb --;int dexc = lower_bound(c.begin(), c.end(), it) - c.begin();if(dexc == c.size()) dexc --;int xa = it, xb = b[dexb], xc = c[dexc];ans = min(ans, 1ll*abs(xa - xb) + abs(xa - xc) + abs(xb - xc));//c a bdexc = upper_bound(c.begin(), c.end(), it) - c.begin();if(dexc != 0) dexc --;dexb = lower_bound(b.begin(), b.end(), it) - b.begin();if(dexb == b.size()) dexb --;xa = it, xb = b[dexb], xc = c[dexc];ans = min(ans, 1ll*abs(xa - xb) + abs(xa - xc) + abs(xb - xc));}// b 當中間值for(auto it : b){//a b cint dexa = upper_bound(a.begin(), a.end(), it) - a.begin();if(dexa != 0) dexa --;int dexc = lower_bound(c.begin(), c.end(), it) - c.begin();if(dexc == c.size()) dexc --;int xb = it, xa = a[dexa], xc = c[dexc];ans = min(ans, 1ll*abs(xa - xb) + abs(xa - xc) + abs(xb - xc));//c b adexc = upper_bound(c.begin(), c.end(), it) - c.begin();if(dexc != 0) dexc --;dexa = lower_bound(a.begin(), a.end(), it) - a.begin();if(dexa == a.size()) dexa --;xb = it, xa = a[dexa], xc = c[dexc];ans = min(ans, 1ll*abs(xa - xb) + abs(xa - xc) + abs(xb - xc));}// c 當中間值for(auto it : c){//a c bint dexa = upper_bound(a.begin(), a.end(), it) - a.begin();if(dexa != 0) dexa --;int dexb = lower_bound(b.begin(), b.end(), it) - b.begin();if(dexb == b.size()) dexb --;int xc = it, xa = a[dexa], xb = b[dexb];ans = min(ans, 1ll*abs(xa - xb) + abs(xa - xc) + abs(xb - xc));//b c adexb = upper_bound(b.begin(), b.end(), it) - b.begin();if(dexb != 0) dexb --;dexa = lower_bound(a.begin(), a.end(), it) - a.begin();if(dexa == a.size()) dexa --;xc = it, xa = a[dexa], xb = b[dexb];ans = min(ans, 1ll*abs(xa - xb) + abs(xa - xc) + abs(xb - xc));}cout << ans << endl;return 0;
}

  • 另一個思路:滑動窗口 O(3n*log(3n))實現
    我們可以標記好每個數來自哪個數組然后統一排序,滑動窗口找相鄰三個不同歸屬的數進行答案比較,這個和上面的相比實現更簡單些!
  • 代碼

#include<bits/stdc++.h>
using namespace std;const int N = 1e5 + 10;
typedef long long LL;int main()
{int l, n, m; cin >> l >> n >> m;// 可以結構體數組,或者pair 存數值與所屬關系,用multimap純屬個人偷懶行為multimap<int, int> cnt;for(int i = 0; i < l; i ++) {int x; cin >> x;cnt.insert(pair<int, int>(x, 1));}for(int i = 0; i < n; i ++){int x; cin >> x;cnt.insert(pair<int, int>(x, 2));}for(int i = 0; i < m; i ++){int x; cin >> x;cnt.insert(pair<int, int>(x, 3));}LL ans = 1e18;vector<LL> st(4, 1e10);// 將st1,2,3賦值1e10表示空for(auto [a,b] : cnt){st[b] = a;if(st[1] != 1e10 && st[2] != 1e10 && st[3] != 1e10){ans = min(ans, 1ll*abs(st[1]-st[2]) + abs(st[1]-st[3]) + abs(st[2]-st[3]));}}cout << ans << endl;return 0;
}

  • 進階思路:O(3n)實現 三路歸并
    假設x < y < z 我們化簡 |x-y|+|y-z|+|z-x| 后發現 我們每一次算出的答案都是2*(max-min)
    所以我們只需要每個三元組中的最大值與最小值即可,所以我們盡可能讓max與min逼近
    這時候就可以三路歸并,每次只讓最小的去靠近最大的值,實現也很簡單。
  • 代碼

#include<bits/stdc++.h>
using namespace std;const int N = 1e5 + 10;
typedef long long LL;int main()
{int l, n, m; cin >> l >> n >> m;vector<int> a(l), b(n), c(m);for(int i = 0; i < l; i ++) cin >> a[i];for(int i = 0; i < n; i ++) cin >> b[i];for(int i = 0; i < m; i ++) cin >> c[i];LL ans = 1e18;for(int i = 0, j = 0, k = 0; i < l && j < n && k < m;){int x = a[i], y = b[j], z = c[k];ans = min(ans, 2*(1ll*max(x, max(y, z)) - min(x, min(y, z))));if(x <= y && x <= z) i ++;else if(y <= x && y <= z) j ++;else k ++;}cout << ans << endl;return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716475.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716475.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716475.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI學習集合-前瞻

AI學習前瞻 工作崗位 算法工程師機器學習工程師圖像算法工程師ai工程師NLP高級算法工程師 學習路線 應用場景 計算機視覺技術應用場景 自然語言應用 AI流程 AI擬人流程 機器人歷史數據經驗模型規律依據模型預測未來依據規律做出判斷 AI基本流程 術語所用到的技術手段數據數…

javascript中對包含關系判斷介紹

本文將為您詳細講解 JavaScript 中對包含關系的判斷&#xff0c;包括數組、字符串等&#xff0c;并提供相應的代碼例子。 1. 數組包含關系判斷 在 JavaScript 中&#xff0c;數組包含關系判斷通常使用 Array.prototype.includes() 方法。這個方法返回一個布爾值&#xff0c;表示…

牛客網C++專項題目整理(2)

1.參加位運算的數據可以是任何類型的數據。請問這句話的說法是正確的嗎&#xff1f; 答案&#xff1a;錯誤 位運算符主要用于整型數據&#xff08;如int、unsigned int、long、unsigned long等&#xff09;和字符型數據&#xff08;如char和unsigned char&#xff09;&#x…

mac 本地使用dockerfile啟動 springboot項目

1.創建Dockerfile放在項目的根目錄下 2.編寫Dockerfile FROM openjdk:11 MAINTAINER ChengLinADD target/JiaLi-0.0.1-SNAPSHOT.jar /app.jar# 暴露 Spring Boot 應用的端口號 EXPOSE 8088 # 啟動 Spring Boot 應用 CMD ["java", "-jar", "app.jar&q…

前端學習第四天-css提升

達標要求 掌握css復合選擇器 塊級元素和行內元素及行內塊的區別? 哪些元素是塊元素,行內元素及行內塊元素? 熟練掌握display的用法 能夠說出css三大特性 熟練運用背景樣式 1. CSS復合選擇器 復合選擇器是由兩個或多個基礎選擇器&#xff0c;通過不同的方式組合而成的…

vue2結合electron開發跨平臺應用(桌面端應用)

1.確定nodejs和electron的版本號 確定nodejs和electron的版本號及其重要&#xff0c;因為electron的開發版本需要指定的nodejs版本支持。 本文安裝測試使用的是: 1.node18.19.0 2.npm10.2.3 3.vue-cli5.0.8 4.electron29.0.0 2.創建vue2項目 vue create elctron29.0.0_no…

zotero | 多平臺同步 | 堅果云

zotero注冊登陸 打開zotero軟件&#xff0c;mac電腦打開首選項&#xff0c;如下圖所示&#xff1a; 然后點擊同步選項&#xff0c;如下圖所示&#xff0c;如果已經有賬號&#xff0c;請登陸賬號&#xff0c;無則注冊賬號之后再登陸&#xff1b; 注冊堅果云賬號 注冊完堅果…

求最短路徑之BF算法

介紹 全稱Bellman-Ford算法&#xff0c;目的是求解有負權邊的最短路徑問題。 考慮環&#xff0c;根據環中邊的邊權之和的正負&#xff0c;將環分為零環、正環、負環。其中零環、正環不會影響最短路徑的求解&#xff0c;而負環會影響最短路徑的求解。 可用BF算法返回一個bool值…

暗黑大氣MT蘋果CMS MT主題源碼-PC版適用于蘋果CMS V10

蘋果CMS MT主題是一款多功能的主題&#xff0c;適用于蘋果CMS V10的暗黑大氣風格。 地 址 &#xff1a; runruncode.com/houtai/19704.html 初次使用說明&#xff1a; 在后臺設置中&#xff0c;選擇MT主題&#xff0c;并在模板目錄中填寫HTML。 后臺地址為&#xff1a;MT主題…

*JAVAWEB--maven*

一:介紹: maven是一種專門管理以及構建JAVA項目的一個工具,maven屹立這么久也是因為其有三個非常好用的功能: 1.提供標準化的項目結構 比方說平時我們編寫JAVA項目的時候,如果想把原本在eclipse當中編寫的項目導入到IDEA當中進行使用,就會導致報錯,因為這兩個的項目結構并不一樣…

圖神經網絡實戰——基于DeepWalk創建節點表示

圖神經網絡實戰——基于DeepWalk創建節點表示 0. 前言1. Word2Vec1.1 CBOW 與 skip-gram1.2 構建 skip-gram 模型1.3 skip-gram 模型1.4 實現 Word2Vec 模型 2. DeepWalk 和隨機行走3. 實現 DeepWalk小結系列鏈接 0. 前言 DeepWalk 是機器學習 (machine learning, ML) 技術在圖…

[Angular 基礎] - routing 路由(上)

[Angular 基礎] - routing 路由(上) 之前部分 Angular 筆記&#xff1a; [Angular 基礎] - 生命周期函數 [Angular 基礎] - 自定義指令&#xff0c;深入學習 directive [Angular 基礎] - service 服務 終于到 routing 了……這部分的內容比我想象的要復雜很多&#xff0c;果…

LC打怪錄 選擇排序 215.Kth Largest Element in an Array

題目鏈接&#xff1a;力扣 選擇排序知識 設第一個元素為比較元素&#xff0c;依次和后面的元素比較&#xff0c;比較完所有元素并找到最小元素&#xff0c;記錄最小元素下標&#xff0c;和第0個下表元素進行交換。在未排序區域中&#xff0c;重復上述操作&#xff0c;以此類推…

力扣每日一題 用隊列實現棧 模擬

Problem: 225. 用隊列實現棧 文章目錄 思路復雜度Code 思路 &#x1f468;?&#x1f3eb; 力扣官解 輔助隊列存棧頂元素主隊列存逆序序列 復雜度 時間復雜度: 添加時間復雜度, 示例&#xff1a; O ( n ) O(n) O(n) 空間復雜度: 添加空間復雜度, 示例&#xff1a; O ( …

js監聽網頁iframe里面元素變化其實就是監聽iframe變化

想要監聽網頁里面iframe標簽內容變化&#xff0c;需要通過監聽網頁dom元素變化&#xff0c;然后通過查詢得到iframe標簽&#xff0c;再通過iframe.contentWindow.document得到ifram內的document&#xff0c;然后再使用選擇器得到body元素&#xff0c;有了body元素&#xff0c;就…

2024年華為OD機試真題-貪吃的猴子-Python-OD統一考試(C卷)

題目描述: 一只貪吃的猴子,來到一個果園,發現許多串香蕉排成一行,每串香蕉上有若干根香蕉。每串香蕉的根數由數組numbers給出。猴子獲取香蕉,每次都只能從行的開頭或者末尾獲取,并且只能獲取N次,求猴子最多能獲取多少根香蕉。 輸入描述: 第一行為數組numbers的長度 第二…

Java和JavaScript之間的主要區別與聯系

目錄 概況 主要區別 聯系 總結 概況 Java和JavaScript&#xff0c;盡管名字相似&#xff0c;但它們在編程世界中卻扮演著截然不同的角色。Java&#xff0c;一種強類型、面向對象的編程語言&#xff0c;廣泛應用于企業級應用和安卓應用開發。它的設計理念是一次編寫&#x…

使用協程庫httpx并發請求

httpx和aiohttp都是比較常用的異步請求庫&#xff0c;當然requests多線程或requestsgevent也是不錯的選擇。 一個使用httpx進行并發請求的腳本如下&#xff1a; import functools import sys import timeimport anyio import httpxasync def fetch(client, results, index) -…

詳解 JavaScript 中的數組

詳解 JavaScript 中的數組 創建數組 注&#xff1a;在JS中的數組不要求元素的類型&#xff0c;元素類型可以一樣&#xff0c;也可以不一樣 1.使用 new 關鍵字創建 let array new Array()2.使用字面量方式創建(常用) let array1 [1,2,3,"4"]獲取數組元素 使用下…

西安-騰訊云-Python面試經驗--一面涼經

自我介紹手撕鏈表排序操作系統 a. 線程和進程區別 b. 線程安全 c. 如何保證線程安全 d. 線程崩潰&#xff0c;會不會影響所在的進程 e. 什么是守護進程&#xff0c;僵尸進程&#xff0c;孤兒進程 f. 如何產生一個守護進程 g. 如何避免僵尸進程或者孤兒進程redis a. 持久化方式有…