日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

从三个数组中选择满足条件的三个数

發布時間:2024/9/30 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从三个数组中选择满足条件的三个数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Given 3 arrays, pick 3 nos, one from each array, say a,b,c such that |a-b|+|b-c|+|c-a| is minimum

如果假設a >=b >= c, 就是求2(a-c), 也就是說最終的值只與最大值和最小值有關

我的想法是將這三個數組的元素加上所屬數組類別的信息,然后進行排序,下面的工作就是和最短鏈珠的做法一樣了,依次找出包含a,b,c數組元素的最小span,然后計算這個span最大值和最小值之差。


網上的做法更為精巧,整個是3數組歸并的過程。首先計算三元組(ai,bj,ck)的值,然后找出三元組中最小的元素,然后將這個最小元素所屬的數組的指針加1.

可以用反證法證明上述思路,設 ai >= bj >= ck

如果j++, 那么獲得的新的三元組的值大于等于之前的三元組

如果i++,那么獲得的新的三元組的值大于等于之前的三元組

所以只有k++, 才有可能獲得的新元祖的值小于之前的三元組


int CalcABS(int a, int b, int c) {return abs(a-b) + abs(a-c) + abs(b-c); }int GetMin(vector<int>& vec) {assert(!vec.empty());int nMin = vec[0];for (int i = 0; i < vec.size(); i++){if (vec[i] < nMin)nMin = vec[i];}return nMin; }int GetABC(int a[], int na, int b[], int nb, int c[], int nc, int& sa, int& sb, int& sc) {assert(a && na>0 && b && nb>0 && c && nc>0);sort(a, a+na);sort(b, b+nb);sort(c, c+nc);int i = 0;int j = 0;int k = 0;sa = sb = sc = 0;int nMin = CalcABS(a[i], b[j], c[k]);while (i != na-1 || j != nb-1 || k != nc-1)//應該用&&連接{vector<int> vec;if (i != na-1) vec.push_back(a[i]);if (j != nb-1) vec.push_back(b[j]);if (k != nc-1) vec.push_back(c[k]);int nRes = GetMin(vec);if (i != na-1 && a[i] == nRes)i++;else if (j != nb-1 && b[j] == nRes)j++;else k++;nRes = CalcABS(a[i], b[j], c[k]);if (nRes < nMin){sa = a[i];sb = b[j];sc = c[k];nMin = nRes;}}return nMin; }

總結

以上是生活随笔為你收集整理的从三个数组中选择满足条件的三个数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。