OJ 1295 最少的交換

2021-10-08 19:20:44 字數 749 閱讀 5055

描述

現在給你乙個由n個互不相同的整數組成的序列,現在要求你任意交換相鄰的兩個數字,使序列成為公升序序列,請問最少的交換次數是多少?

輸入輸入包含多組測試資料。每組輸入第一行是乙個正整數n(n<500000),表示序列的長度,當n=0時。

接下來的n行,每行乙個整數a[i](0<=a[i]<=999999999),表示序列中第i個元素。

輸出對於每組輸入,輸出使得所給序列公升序的最少交換次數。

輸入樣例 159

1054

3123

0輸出樣例 160

這題可以使用二分歸併排序來進行排序,先把陣列從中間向兩邊一分再分,再去回溯即可做到排序,由於資料較多且較大所以建議定義陣列時使用long long,由於是相鄰的排序所以互換的裡面就是+1而是+j-k。

#include using namespace std;

long a[500005],temp[500005],cont;

void megasort(int low,int mid,int high)

else

}while(i<=mid)

temp[k++]=a[i++];

while(j<=high)

temp[k++]=a[j++];

for(int i=low; i<=high; i++)

}void mega(int low,int high)

return 0;

}

用最少的並行交換完成排序

一次 交換 操作是指將數列中的兩個數字置對換。我們假設,互不相交的若干個交換操作可以一次同時進行 換句話說,如果k個交換中任兩個都不會對同乙個數進行操作,那麼這k個操作可以並行完成。例如,在數列 10,6,8,5,2,3,1,4,7,9 中,我們可以同時交換第4個數和第6個數,第8個數和第9個數,以...

奶牛喝水最少需要的交換次數

題目描述 有n 1 n 1000 頭奶牛,它們都被標上乙個優先等級編號 1,2或3。用來表示它們喝水時的優先次序,編號為l的最優先,編號為2的其次,編號為3的最後。每天奶牛開始時排成一行,但總是很亂,需要你把它們重新排成編號為1的奶牛在最前面,編號為2的其次,編號為3的奶牛在最後。你能計算出最少需要...

通過交換相鄰數來完成排序所需要的最少交換次數

對乙個無序序列進行排序,要求一次只能交換相鄰的兩個數,那麼最少需要交換多少次才可以完成排序呢?本問題假設序列所有數各不相同。概念介紹 1 逆序。一般認為從左向右序列的數字增大認為是正序的,那麼從左到右序列的序列數字出現減小就認為是逆序的。乙個 逆序 的數學定義是這樣的,如果存在正整數 i,j 使得 ...