文章目錄
1. 題目描述
1.1. Limit
Time Limit: C/C++ 1秒,其他語言2秒
Memory Limit: C/C++ 262144K,其他語言524288K
1.2. Problem Description
牛客幼兒園的小朋友課間操時間需要按照學號從小到大排隊,但是他們太小了只能站成一列順序卻不對,現在幼兒園的阿姨需要幫忙交換小朋友的位置讓他們最終有序,阿姨希望能儘快完成交換操作,問最少需要交換多少次,才能使得小朋友們從小到大排好。注意:每個小朋友的學號不同,但是未必連續,因爲可能有小朋友請假了沒有來。
1.3. Input
第一行一個整數 。
接下來 行每行一個整數,爲小朋友們的隊列。
1.4. Output
一個整數表示小朋友們的最小交換次數。
1.5. Sample Input
3
2
1
3
1.6. Sample Output
1
1.7. Note
,其他整數均
1.8. Source
2. 解讀
先將數組排序,我們就得到每個數排序後的位置。
然後對原始的數組進行遍歷,如果它的位置和排序後的位置不一致,則將其交換到排序後的位置。每次交換至少將一個數交換到其應該所屬的位置,有時能夠同時將兩個數都交換到其應該所屬的位置。
記錄交換次數,遍歷完以後就得到了最小交換次數。
3. 代碼
#include <algorithm>
#include <iostream>
#include <map>
using namespace std;
const int N = 2e6 + 5;
int a[N];
int b[N];
map<int, int> mp;
int main()
{
int n;
// 輸入
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
b[i] = a[i];
mp[a[i]] = i;
}
// 排序
sort(b, b + n);
int sum = 0;
// 計算
for (int i = 0; i < n; i++) {
if (a[i] != b[i]) {
int x = mp[a[i]], y = mp[b[i]];
// 交換
swap(a[x], a[y]);
mp[a[x]] = x;
mp[a[y]] = y;
// 累加
sum++;
}
}
cout << sum;
}
聯繫郵箱:[email protected]
CSDN:https://me.csdn.net/qq_41729780
知乎:https://zhuanlan.zhihu.com/c_1225417532351741952
公衆號:複雜網絡與機器學習
歡迎關注/轉載,有問題歡迎通過郵箱交流。