PAT_甲级_1067

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lzc842650834/article/details/87950565

1067 Sort with Swap(0, i) (25 分)

Given any permutation of the numbers {0, 1, 2,…, N−1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY operation that is allowed to use? For example, to sort {4, 0, 2, 1, 3} we may apply the swap operations in the following way:

Swap(0, 1) => {4, 1, 2, 0, 3}
Swap(0, 3) => {4, 1, 2, 3, 0}
Swap(0, 4) => {0, 1, 2, 3, 4}
Now you are asked to find the minimum number of swaps need to sort the given permutation of the first N nonnegative integers.

Input Specification:
Each input file contains one test case, which gives a positive N (≤10​5​​ ) followed by a permutation sequence of {0, 1, …, N−1}. All the numbers in a line are separated by a space.

Output Specification:
For each case, simply print in a line the minimum number of swaps need to sort the given permutation.

Sample Input:

10
3 5 7 2 6 4 9 0 8 1

Sample Output:

9

这题。。。写了一天才ac。。。
注释掉的是另一种笨方法。

#include<iostream>
#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
struct info{
    int data;
    int seq;
    int seq_begin;
}arr[100010];

int pos[100010];
//int place[100010];

bool cmp(info a, info b)
{
    return a.data < b.data;
}

bool cmp_2(info a, info b)
{
    return a.seq_begin < b.seq_begin;
}
int ii = 0;
int main()
{
    int num, temp;
    cin >> num;
    int k = num -1;
    for (int i = 0; i < num; i++) {
        scanf("%d", &temp);
        arr[i].data = temp;
        arr[i].seq_begin = i;
        if (temp == i && i != 0) {
            k--;
        }
    }
    sort(arr, arr + num, cmp);
    for (int i = 0; i < num; i++) {
        arr[i].seq = i;
    }
    sort(arr, arr + num, cmp_2);
    for (int i = 0; i < num; i++) {
        pos[i] = arr[i].seq;
    }
    int _count = 0;
    int zero_pos;
    for (int i = 0; i < num; i++) {
        if (pos[i] == 0) {
            zero_pos = i;
            break;
        }
    }
    sort(arr, arr + num, cmp);
    for (int i = 0; i < num; i++) {
        place[i] = arr[i].seq_begin;
    }
    while(1) {
        if (k == 0) {
            cout << _count << endl;
            return 0;
        } else {
            _count++;
            if (pos[0] != 0) {
//                swap(pos[zero_pos], pos[place[zero_pos]]);
//                int temp_ = zero_pos;
//                k--;
//                zero_pos = place[zero_pos];
//                int tt = place[0];
//                place[0] = place[temp_];
//                place[temp_] = tt;
                k--;
                swap(pos[0], pos[pos[0]]);
            } else {
                for (; ii < num; ii++) {
                    if (pos[ii] != ii) {
                        swap(pos[0], pos[ii]);
//                        place[pos[zero_pos]] = place[zero_pos];
//                        zero_pos = ii;
//                        place[0] = ii;
                        break;
                    }
                }
            }
        }
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/lzc842650834/article/details/87950565