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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

寻找捣乱分子对

發布時間:2024/9/30 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 寻找捣乱分子对 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://blog.csdn.net/wuzhekai1985/article/details/6718256

問題描述:多人排成一個隊列,我們認為從低到高是正確的序列,但是總有部分人不遵守秩序。如果說,前面的人比后面的人高(兩人身高一樣認為是合適的),那么我們就認為這兩個人是一對“搗亂分子”,比如說,現在存在一個序列:176, 178, 180, 170, 171
? ? ? 這些搗亂分子對為<176, 170>, <176, 171>, <178, 170>, <178, 171>, <180, 170>, <180, 171>,那么,現在給出一個整型序列,請找出這些搗亂分子對的個數(僅給出搗亂分子對的數目即可,不用具體的對)

? ? ? 思路:最簡單的就是用兩層循環,即考察每個元素,檢查該元素后面的元素是否小于它,如果是就找到一個搗亂分子對。復雜度為O(n^2)。這道題的一種改進方案是用分治法,用到了歸并排序的思想。我們可以將數組分成兩部分,總的搗亂分子對為: 前半部分的搗亂分子對 + 后半部分的搗亂分子對 + X,這里的X為兩部分合并中出現的搗亂分子對,什么情況下會出現呢?假設前半部分的元素范圍為 A[from] 到A[mid],后半部分的元素范圍為A[mid + 1] 到A[to],考慮前半部分的某元素A[i]和后半部分的某元素A[j],如果A[j] < A[i],由于兩部分都是排好序的,因此搗亂分子對增加 mid - i + 1個,也就是說A[j]小于A[i], A[i+1].. A[mid],這個關系顯然成立。


一般的解題步驟就要想到二分,遞歸,動態規劃,最后是搜索


int Merge(int *pArray, int from, int mid, int to) {int i = from, j = mid + 1;int k = 0, num = 0;int *pTmp = new int[to-from+1];while(i<=mid && j<=to) //歸并排序的主框架{if(pArray[i] <= pArray[j])pTmp[k++] = pArray[i++];else{num += (mid - i + 1); //增加搗亂分子對for(int l = i; l <= mid; l++) //輸出搗亂分子cout<<pArray[l]<<' '<<pArray[j]<<endl;pTmp[k++] = pArray[j++];}}while(i <= mid) pTmp[k++] = pArray[i++];while(j <= to) pTmp[k++] = pArray[j++];for(k = from ; k <= to; k++)pArray[k] = pTmp[k - from];delete [] pTmp;return num; } int MergeSort(int *pArray, int from, int to) {if(from < to){int mid = (from + to) /2;int num = MergeSort(pArray, from ,mid) + MergeSort(pArray, mid+1, to); //分別算出兩部分的搗亂分子對num += Merge(pArray, from, mid, to); //合并中出現的搗亂分子對return num;}return 0; }

總結

以上是生活随笔為你收集整理的寻找捣乱分子对的全部內容,希望文章能夠幫你解決所遇到的問題。

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