陣列排序 計算最少交換次數

2021-09-12 23:27:22 字數 984 閱讀 3289

交換瓶子

有n個瓶子,編號 1 ~ n,放在架子上。

比如有5個瓶子:

2 1 3 5 4

要求每次拿起2個瓶子,交換它們的位置。

經過若干次後,使得瓶子的序號為:

1 2 3 4 5

對於這麼簡單的情況,顯然,至少需要交換2次就可以復位。

如果瓶子更多呢?你可以通過程式設計來解決。

輸入格式為兩行:

第一行: 乙個正整數n(n<10000), 表示瓶子的數目

第二行:n個正整數,用空格分開,表示瓶子目前的排列情況。

輸出資料為一行乙個正整數,表示至少交換多少次,才能完成排序。

例如,輸入:

53 1 2 5 4

程式應該輸出:

3再例如,輸入:

55 4 3 2 1

程式應該輸出:

2資源約定:

峰值記憶體消耗 < 256m

cpu消耗  < 1000ms

請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入...」 的多餘內容。

所有**放在同乙個原始檔中,除錯通過後,拷貝提交該原始碼。

注意: main函式需要返回0

注意: 只使用ansi c/ansi c++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。

注意: 所有依賴的函式必須明確地在原始檔中 #include , 不能通過工程設定而省略常用標頭檔案。

提交時,注意選擇所期望的編譯器型別。

#includeusing namespace std;

const int n=10005;

int n;

int a[n];

int num;

void print()

return cnt;

}void solve()

int main()

solve();

} return 0;

}

最少交換次數

第乙個問題 現在想通過交換相鄰元素的操作把乙個給定序列交換成有序,最少需要交換的次數是多少?比如3 1 2 4 5需要最少交換2次。答案 需要交換的最少次數為該序列的逆序數。證明 可以先將最大數交換到最後,由於是相鄰兩個數交換,需要交換的次數為最大數後面的數的個數 可以看做是最大數的逆序數 然後,交...

最少交換次數

bfs,折半搜尋,因為直接搜大概有 12 13?因為每個狀態都會擴充套件出m種狀態大概是 12 13,然而可以折半搜尋,只搜一半,狀態數變成 12 7可以接受,但是事實上極限資料要跑很長很長時間,據說正解是啟發式搜尋?沒學過 include include include include inclu...

1151 最少交換次數來組合所有的 1

給出乙個二進位制陣列 data,你需要通過交換位置,將陣列中 任何位置 上的 1 組合到一起,並返回所有可能中所需 最少的交換次數。示例 1 輸入 1,0,1,0,1 輸出 1 解釋 有三種可能的方法可以把所有的 1 組合在一起 1,1,1,0,0 交換 1 次 0,1,1,1,0 交換 2 次 0...