牛客網 NC207078 交換 貪心算法

1. 題目描述

1.1. Limit

Time Limit: C/C++ 1秒,其他語言2秒

Memory Limit: C/C++ 262144K,其他語言524288K

1.2. Problem Description

牛客幼兒園的小朋友課間操時間需要按照學號從小到大排隊,但是他們太小了只能站成一列順序卻不對,現在幼兒園的阿姨需要幫忙交換小朋友的位置讓他們最終有序,阿姨希望能儘快完成交換操作,問最少需要交換多少次,才能使得小朋友們從小到大排好。注意:每個小朋友的學號不同,但是未必連續,因爲可能有小朋友請假了沒有來。

1.3. Input

第一行一個整數 NN

接下來 NN 行每行一個整數,爲小朋友們的隊列。

1.4. Output

一個整數表示小朋友們的最小交換次數。

1.5. Sample Input

3
2
1
3

1.6. Sample Output

1

1.7. Note

N100000N\leq100000,其他整數均 109\leq 10^9

1.8. Source

牛客網 NC207078 交換

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

公衆號:複雜網絡與機器學習

歡迎關注/轉載,有問題歡迎通過郵箱交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章