zoukankan      html  css  js  c++  java
  • 1067 Sort with Swap(0, i)

    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 (≤) 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

    题意:

      给出一串数字,要求对这串数字进行排序,但是排序的过程中只能使用swap(0, i),即只能够用0来和另外一个数字交换。

    思路:

      用index[]数组来保存每个数字的下标,即index[0] = 3,表示数字0在数组中下标为3的位置处。如果下标和数字能够一一对应的话,两者就能够形成闭环的关系。例如{2, 0, 1}。

    index[0] = 1;

    index[1] = 2;

    index[2] = 0;

    我们可以通过一个while循环来让这个闭环中的部分数字回到自己正确的位置上去。

    while (index[0] != 0) {
            swap(index[0], index[index[0]]);
    }

    这样的闭环在一个数组中可能不止一个(如果排序完成的话,每一个数字都会单独的构成一个闭环),所以我们要遍历整个数组,确保每一个数字都应该在自己的位置上。如果0所在的闭环已经有序,但是index[i] != i; 这时候我们应该将0,插入到i所在的闭环中,在下一轮循环中将i所在中的闭环中的数字,尽可能的放在自己应该在的位置上。如此循环,直至满足题意。

    Code:

     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 int main() {
     6     int n, t;
     7     cin >> n;
     8     vector<int> index(n+1);
     9     for (int i = 0; i < n; ++i) {
    10         cin >> t;
    11         index[t] = i;
    12     }
    13     int count = 0;
    14     for (int i = 1; i < n; ++i) {
    15         if (i != index[i]) {
    16             while (index[0] != 0) {
    17                 swap(index[0], index[index[0]]);
    18                 count++;
    19             }
    20             if (i != index[i]) {
    21                 swap(index[0], index[i]);
    22                 count++;
    23             }
    24         }
    25     }
    26     cout << count << endl;
    27     return 0;
    28 }
    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    4 Apr 18 软件开发目录 logging模块的使用 序列化(Json, Pickle) os模块
    3 Apr 18 内置函数 列表生成式与生成器表达式 模块的使用之import 模块的使用之from…import…
    2 Apr 18 三元表达式 函数递归 匿名函数 内置函数
    30 Mar 18 迭代器 生成器 面向过程的编程
    29 Mar 18 函数 有参、无参装饰器
    28 Mar 18 函数
    27 Mar 18 函数的参数
    26 Mar 18 函数介绍
    23 Mar 18 文件处理
    22 Mar 18 补充数据类型+字符编码+文件处理
  • 原文地址:https://www.cnblogs.com/h-hkai/p/12827351.html
Copyright © 2011-2022 走看看