將 的任意乙個排列進行排序並不困難,這裡加一點難度,要求你只能通過一系列的 swap(0, *) —— 即將乙個數字與 0 交換 —— 的操作,將初始序列增序排列。例如對於初始序列 ,我們可以通過下列操作完成排序:
輸入格式:
輸入在第一行給出正整數 n (≤105 );隨後一行給出 的乙個排列。數字間以空格分隔。
輸出格式:
在一行中輸出將給定序列進行增序排序所需要的最少的與 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 ...