藍橋 交換瓶子(memcpy 的使用)

2021-09-11 16:06:58 字數 1589 閱讀 3639

交換瓶子

有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 , 不能通過工程設定而省略常用標頭檔案。

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

思路:遍歷一遍,通過交換使得每個位置i上對應是正確的瓶子,在遍歷結束後即可保證所有位置對應的瓶子編號為正確的。

這裡用bolt[i]儲存初始序列,通過index[i]找到瓶子i當前位置。

**如下:

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

1e4+10;

int bolt[maxn]

,index[maxn]

;int

main()

for(

int i=

1;i<=n;i++)}

cout

}

錯誤解法如下:

開始的時候錯誤認為,交換一次就能有兩個瓶子回到正確的位置

#include

#include

#include

#include

#include

const

int maxn=

10001

;using

namespace std;

intmain()

memcpy

(b,a,

sizeof

(a))

;sort

(b,b+n)

;for

(int i=

0; i) cout<<

(num+1)

/2;return0;

}

藍橋 交換瓶子

交換瓶子 有n個瓶子,編號 1 n,放在架子上。比如有5個瓶子 2 1 3 5 4要求每次拿起2個瓶子,交換它們的位置。經過若干次後,使得瓶子的序號為 1 2 3 4 5 對於這麼簡單的情況,顯然,至少需要交換2次就可以復位。如果瓶子更多呢?你可以通過程式設計來解決。輸入格式為兩行 第一行 乙個正整...

藍橋 交換瓶子

有n個瓶子,編號 1 n,放在架子上。比如有5個瓶子 2 1 3 5 4 要求每次拿起2個瓶子,交換它們的位置。經過若干次後,使得瓶子的序號為 1 2 3 4 5 對於這麼簡單的情況,顯然,至少需要交換2次就可以復位。如果瓶子更多呢?你可以通過程式設計來解決。輸入格式為兩行 第一行 乙個正整數n n...

交換瓶子 藍橋杯

交換瓶子 有n個瓶子,編號 1 n,放在架子上。比如有5個瓶子 2 1 3 5 4 要求每次拿起2個瓶子,交換它們的位置。經過若干次後,使得瓶子的序號為 1 2 3 4 5 對於這麼簡單的情況,顯然,至少需要交換2次就可以復位。如果瓶子更多呢?你可以通過程式設計來解決。輸入格式為兩行 第一行 乙個正...