第七屆藍橋杯省賽C B組 交換瓶子

2021-10-03 11:47:21 字數 1312 閱讀 5964

演算法標籤 圖論 環 置換群 貪心

題目描述

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

比如有 5 個瓶子:

2 1 3 5 4

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

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

1 2 3 4 5

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

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

輸入格式

第一行包含乙個整數 n,表示瓶子數量。

第二行包含 n 個整數,表示瓶子目前的排列狀況。

輸出格式

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

資料範圍

1≤n≤10000,
輸入樣例1:
5

3 1 2 5 4

輸出樣例1:
3
輸入樣例2:
5

5 4 3 2 1

輸出樣例2:
2
思路

由樣例1

3 1 2 5 4

轉為1 2 3 4 5

對於瓶子順序而言 則會有

3 對應正確順序的3的位子 即當前的 2

2 對應正確順序的2的位子 即當前的 1

1 對應正確順序的2的位子 即當前的 3

這連線則形成乙個閉環

總共有兩個閉環

環內兩個點的變動可以使得環**為2

環外的兩個點的變動可以使得兩個環合併為1

環最簡的情況下是 自指,即存在n個環

這種情況同時也是 該題轉換為正確順序之後的情況

則可以遍歷出當前所有環的數量 k

從k變更到n 需要n-k步驟

答案即為 n-k

在實際的操作過程當中,遍歷環可以從1(i)出發每次指向i=a[i]即指向指定的目標

時間複雜度

實際從n^2優化到了n

c++ **

#include

#include

using

namespace std;

const

int n=

1e4+10;

bool st[n]

;int a[n]

,n,k;

intmain()

cout

return0;

}

第七屆藍橋杯省賽C B組 交換瓶子

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

藍橋杯 交換瓶子 第七屆藍橋杯省賽C B組

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

第七屆藍橋杯省賽C B組 抽籤

抽籤 x星球要派出乙個5人組成的觀察團前往w星。其中 a國最多可以派出4人。b國最多可以派出2人。c國最多可以派出2人。那麼最終派往w星的觀察團會有多少種國別的不同組合呢?下面的程式解決了這個問題。陣列a 中既是每個國家可以派出的最多的名額。程式執行結果為 defff cefff cdfff cde...