案例7 1 5 與零交換 25分

2021-10-10 08:28:03 字數 1816 閱讀 2425

將 的任意乙個排列進行排序並不困難,這裡加一點難度,要求你只能通過一系列的 swap(0, *) —— 即將乙個數字與 0 交換 —— 的操作,將初始序列增序排列。例如對於初始序列 ,我們可以通過下列操作完成排序:

輸入格式:

輸入在第一行給出正整數 n (≤10​5​​ );隨後一行給出 的乙個排列。數字間以空格分隔。

輸出格式:

在一行中輸出將給定序列進行增序排序所需要的最少的與 0 交換的次數。

輸入樣例:

1035

7264

9081

輸出樣例:

可以看出,樣例中存在兩個交換環,每個交換環需要交換n-1次可以是使所有數字回到原位(n為環中元素個數)。根據題目中要求【與零交換】,對比青綠色區域不難看出,交換次序完全一致,只不過把0的位置換成了5。對於不含0的環,我們需要花費兩次交換分別把0移入交換環,和移除交換環(如圖深藍色區域)

另外還需要考慮特殊情況:交換環中只有乙個數字則不需要交換(如樣例中的8),以及若a[0]初始值=0(測試點3)

dfs

#include

#include

using

namespace std;

int n, x, cnt, ans;

vector<

int>a, vis, circle;

void

dfs(

int i)

}int

main()

for(

auto it : circle)

ans +

=(it -1)

; cout << ans +2*

(circle.

empty()

?0: circle.

size()

-(a[0]

?1:0

))<< endl;

return0;

}

並查集

#include

#include

using

namespace std;

#define max 100005

int a[max]

, f[max]

;int

find

(int x)

void

union

(int a,

int b)

intmain()

map<

int,

int>circle;

for(

int i =

0; i < n;

++i)

for(

auto

&it : circle)

ans +

=(circle.

size()

-1);

cout << ans +2*

(circle.

size()

? circle.

size()

-(a[0]

?1:0

):0)

<< endl;

return0;

}

資料結構PTA 案例7 1 5 與零交換

將 的任意乙個排列進行排序並不困難,這裡加一點難度,要求你只能通過一系列的 swap 0,即將乙個數字與 0 交換 的操作,將初始序列增序排列。例如對於初始序列 我們可以通過下列操作完成排序 swap 0,1 swap 0,3 swap 0,4 本題要求你找出將前 n 個非負整數的給定排列進行增序排...

7 12 與零交換 (25 分)

將 的任意乙個排列進行排序並不困難,這裡加一點難度,要求你只能通過一系列的 swap 0,即將乙個數字與 0 交換 的操作,將初始序列增序排列。例如對於初始序列 我們可以通過下列操作完成排序 本題要求你找出將前 n 個非負整數的給定排列進行增序排序所需要的最少的與 0 交換的次數。輸入在第一行給出正...

7 15 PAT排名彙總 (25 分

每次考試會在若干個不同的考點同時舉行,每個考點用區域網,產生本考點的成績。考試結束後,各個考點的成績將即刻彙總成一張總的排名表。現在就請你寫乙個程式自動歸併各個考點的成績並生成總排名表。輸入的第一行給出乙個正整數n 100 代表考點總數。隨後給出n個考點的成績,格式為 首先一行給出正整數k 300 ...